Forum » Programiranje » Mariadb (InnoDB) istočasni insert v tabelo iz različnih procesov
Mariadb (InnoDB) istočasni insert v tabelo iz različnih procesov
HotBurek ::
Delam iskalnik po spletnih trgovinah.
Zaenkrat en proces zbira url-je in jih vpisuje v tabelo.
Druga dva procesa pa potem download-ata podatke.
In tu je prišlo do težave. Tega sedaj še nisem rešil. Trenutno je v bazi 240.000 produktov, in zaenkrat novih ne dodajam.
Sedaj sem rešil proces buildanja autocomplet-a. Sedaj moram še pofiksat search proces. Tu me malo matra, ker search rezultate na serverju zbildam v html in to vračam kot response. Tu mislim, da server potrebuje kakšno sekundo ali dve. Sem pa omejil rezultate na max 100.
And yes, I know, da "vi" delate tako, da vrnete (json) seznam, in potem JS na klientu zbilda html. Za to bo čas v naslednjem rewrite-u.
Prvi write je tako skoraj pri koncu in bo kmalu čas za public test. Potem pa rewrite.
In s tem, da že v prvo probaš naredit vse idealno, sem zgubil preveč časa, na koncu pa iskalnik kot celota ni delal. Sedaj pa bo.
Zaenkrat en proces zbira url-je in jih vpisuje v tabelo.
Druga dva procesa pa potem download-ata podatke.
In tu je prišlo do težave. Tega sedaj še nisem rešil. Trenutno je v bazi 240.000 produktov, in zaenkrat novih ne dodajam.
Sedaj sem rešil proces buildanja autocomplet-a. Sedaj moram še pofiksat search proces. Tu me malo matra, ker search rezultate na serverju zbildam v html in to vračam kot response. Tu mislim, da server potrebuje kakšno sekundo ali dve. Sem pa omejil rezultate na max 100.
And yes, I know, da "vi" delate tako, da vrnete (json) seznam, in potem JS na klientu zbilda html. Za to bo čas v naslednjem rewrite-u.
Prvi write je tako skoraj pri koncu in bo kmalu čas za public test. Potem pa rewrite.
In s tem, da že v prvo probaš naredit vse idealno, sem zgubil preveč časa, na koncu pa iskalnik kot celota ni delal. Sedaj pa bo.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
murrieta ::
INSERT INTO table(id) SELECT id + 1 FROM table ORDER by id DESC LIMIT 1;
Sintakso bos pa ze poflikal sam, ne da se mi zdajle probavat.
Pa mimogrede, mogoce bi ti kaksna graf baza (sicer nisem fan) kaj bolj prav prisla kot SQL, ker ne bos delal veliko operacij nad samimi podatki.
Sintakso bos pa ze poflikal sam, ne da se mi zdajle probavat.
Pa mimogrede, mogoce bi ti kaksna graf baza (sicer nisem fan) kaj bolj prav prisla kot SQL, ker ne bos delal veliko operacij nad samimi podatki.
Zgodovina sprememb…
- spremenilo: murrieta ()
win64 ::
Dvomim da spletni strežnik potrebuje 2 sekundi da zgenerira HTML iz pripravljenih podatkov.
Iskanje po bazi te heca. Gole baze niso najbolj optimalne za tekstovno iskanje po veliki količini podatkov.
Imaš pa možnost generiranje text index v bazi ali izven nje.
Za tvojo bazo je npr. to https://www.tutorialandexample.com/mysq... (nepreizkušeno na mysql).
Drugače pa recimo, če želiš iskalnik implementirat ločeno od baze:
- https://www.elastic.co/elasticsearch/
- https://lucene.apache.org/
Manjka ti lock pri branju. Vsaj za SQL server velja, da sta to dve akciji.
Iskanje po bazi te heca. Gole baze niso najbolj optimalne za tekstovno iskanje po veliki količini podatkov.
Imaš pa možnost generiranje text index v bazi ali izven nje.
Za tvojo bazo je npr. to https://www.tutorialandexample.com/mysq... (nepreizkušeno na mysql).
Drugače pa recimo, če želiš iskalnik implementirat ločeno od baze:
- https://www.elastic.co/elasticsearch/
- https://lucene.apache.org/
Dvomim da spletni strežnik potrebuje 2 sekundi da zgenerira HTML iz pripravljenih podatkov.
Iskanje po bazi te heca. Gole baze niso najbolj optimalne za tekstovno iskanje po veliki količini podatkov.
Imaš pa možnost generiranje text index v bazi ali izven nje.
Za tvojo bazo je npr. to https://www.tutorialandexample.com/mysq... (nepreizkušeno na mysql).
Drugače pa recimo, če želiš iskalnik implementirat ločeno od baze:
- https://www.elastic.co/elasticsearch/
- https://lucene.apache.org/
Manjka ti lock pri branju. Vsaj za SQL server velja, da sta to dve akciji.
INSERT INTO table(id) SELECT id + 1 FROM table ORDER by id DESC LIMIT 1;
Zgodovina sprememb…
- spremenil: win64 ()
HotBurek ::
Full text je malo-da-ne en navaden šajse.
Npr. da sta v tabeli dva row-a:
0 ena dogla kava
1 kava
In potem search term: kava
FTS bo izpisal oba, pri čemer bo uporabil ORDER BY id. In to kljub temu, da je na 1-ki čisto 100% match, na 0-li pa je search term čisto na koncu (z najmanjšo težo).
Problem tega se je primeni potem pokazal takole.
Recimo, da prvo vneseš v bazo produkte ene trgovine, katera ima 100 produktov in vsak produkt ima nekje v imenu "kava". Potem vneseš produkte ostalih trgovin, med katerimi imajo nekateri prav tako notri "kava".
In FTS search "kava" (pa da je limit 100) bo potem vedno vračal samo produkte prve trgovine, vse ostalo sploh ne pride ven. In ORDER BY MATCH tega nikakor ne reši. Krneki.
Npr. da sta v tabeli dva row-a:
0 ena dogla kava
1 kava
In potem search term: kava
FTS bo izpisal oba, pri čemer bo uporabil ORDER BY id. In to kljub temu, da je na 1-ki čisto 100% match, na 0-li pa je search term čisto na koncu (z najmanjšo težo).
Problem tega se je primeni potem pokazal takole.
Recimo, da prvo vneseš v bazo produkte ene trgovine, katera ima 100 produktov in vsak produkt ima nekje v imenu "kava". Potem vneseš produkte ostalih trgovin, med katerimi imajo nekateri prav tako notri "kava".
In FTS search "kava" (pa da je limit 100) bo potem vedno vračal samo produkte prve trgovine, vse ostalo sploh ne pride ven. In ORDER BY MATCH tega nikakor ne reši. Krneki.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Utk ::
Če ti ne uporabljaš pravilno, še ne pomeni, da je šajze. Dela to kar si mu naročil, da dela. V takem primeru moraš preiskat celo bazo in obtežit rezultate (ali pa toliko da imaš zadost dovolj dobrih rezultatov), in po tem sortirat, ne pa po nekem idju, ki ti nič ne pove o kvaliteti rezultata.
Zgodovina sprememb…
- spremenil: Utk ()
HotBurek ::
Ne, ne dela tega, kar sem naročil. Oz dela, a je šajse.
SET @search1 = 'kava'; SELECT `id`, `string1`, MATCH(`string1`) AGAINST(@search1 IN NATURAL LANGUAGE MODE) AS 'relevance' FROM `tabela1` WHERE MATCH(`string1`) AGAINST(@search1 IN NATURAL LANGUAGE MODE) ORDER BY MATCH(`string1`) AGAINST(@search1 IN NATURAL LANGUAGE MODE) DESC;
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
HotBurek ::
Tole je pa rezultat zgornjega kverija:
Šaj-se.
id|string1 |relevance | --+--------------+------------------+ 0|ena dolga kava|0.0000000018859283| 1|kava |0.0000000018859283|
Šaj-se.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
Spura ::
Autoincrement mi ni všeč čisto iz estetskega razloga.
In ta je, da začne štet pri 1 in ne 0.
To bi sicer lahko pofixal, in vnesel prva dva row-a na roke, potem pa auto...
To je najbolj debilen od vseh moznih debilnih razlogov zakaj bi sel clovek delat to kar ti delas ali pa kar je kuall pisal. Ne samo da je stokrat pocasnejse, ampak celo ne dela in delas pol neke retrye. Kako ti to ne pove da delas neki narobe? In tudi ce bi delal, kaksen legacy je to. Po cisto vsaki metriki absolutno cvek ideja.
Moram pa rečt, da sem kar malo presenečen, koliko se vas je odzvalo z željo po pumpanju lastnega ego-ta.
Vsakic je isto: Ti se napacno lotis stvari, potem imas problem, odpres temo, folk ti svetuje da cisto spremenis pristop, ti noces poslusat, potem ti nekdo napise neko "resitev" znotraj teh tvojih idej, ki seveda dela k drek, ti si zadovoljen, ostale pa obtozis da imajo ego. Ubistvu imas ti ego, ker ne preneses nobene kritike svojih idej in si nic ne pustis dopovedat.
Odprl si kup tem za zelo kompleksne searche v SQL kjer je ful pomembn relevance in ordering, a nisi pomislil, da bi za to uporabil kak produkt ki je namenjen temu. Ti ne rabis real-time azurnost vpisanih podatkov, ti ne rabis real-time azuriranih indexov.
HotBurek ::
Ego si pojdi pumpat kam drugam. Hvala.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
murrieta ::
Manjka ti lock pri branju. Vsaj za SQL server velja, da sta to dve akciji.
INSERT INTO table(id) SELECT id + 1 FROM table ORDER by id DESC LIMIT 1;
Ja, nisem mu odgovarjal kako kaj lockati ampak, da se izogne kolobocijam na prejsnji strani.
Sicer je pa imho kar pocne neumnost, uporabis autoincrement, pa magari, ce ga implementiras kot trigger in to je to. Dejansko iz napisanega, ne razumem zakaj se ga izogiba.
Zgodovina sprememb…
- spremenilo: murrieta ()
HotBurek ::
Kot rešitev sem uporabil UUID. O tem sem tudi pisal.
Autoincrement pa nisem želel uporabiti iz preprostega razloga. In to je, da začne štet pri 1 in ne 0. V configu se to ne da spremenit.
Autoincrement pa nisem želel uporabiti iz preprostega razloga. In to je, da začne štet pri 1 in ne 0. V configu se to ne da spremenit.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
Utk ::
Autoincrement pa nisem želel uporabiti iz preprostega razloga. In to je, da začne štet pri 1 in ne 0.
To ni preprost razlog, ker sem precej prepričan, da ga ne bi razumel niti en doktor računalništva, pa če jih 1000 skup zbobnamo.
OracleDev ::
se strinjam s Spura, ravno zarad tega razloga sem svoje komentarje začel na način kakršnga sm začel. Že par let (lahko da pretiravam) je ista zgodba s temi tvojimi temami in se očitno v teh letih nisi kej dost naučil. Ego gor al pa dol.
HotBurek ::
Kaj pa je tako težkega za razumet, da če imaš na voljo 8 bitov, da bi želel, da je prvi vnos 0000 0000 in ne 0000 0001?
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
OracleDev ::
lol, za take stvari pač ne uporabljaš ne max, ne sekvenc, ne auto increment. Vidim da maš že ideje za naslednje teme.
Zgodovina sprememb…
- spremenil: OracleDev ()
Utk ::
HotBurek ::
Čaki mal, zdej se pa že norca delate.
Dobra rešitev problema hitrega in bolj-ali-manj istočasnega vnosa, ki se pojavi ob uporabi maxid + 1, JE tudi autoincrement.
Utk,, število bitov, ki jih imaš na voljo, ne vplivajo na to, da bo autoincrement prvi vnosu kot prvi row vnesel 1(DEC) in ne nule.
Dobra rešitev problema hitrega in bolj-ali-manj istočasnega vnosa, ki se pojavi ob uporabi maxid + 1, JE tudi autoincrement.
Utk,, število bitov, ki jih imaš na voljo, ne vplivajo na to, da bo autoincrement prvi vnosu kot prvi row vnesel 1(DEC) in ne nule.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Utk ::
Čaki mal, zdej se pa že norca delate.
Ti si začel. Mislim, kaj te briga za tist en bit? Če ti bo šlo tako na tesno z biti, ga boš itak najebal. Da ne govorimo o tem, da ta tvoj uuid itak sigurno porabi več kot 8 bitov.
HotBurek ::
Well, enega briga barva ventilčkov na gumah od avta, drugega pač ne.
Ne vem, v čem je point, da če tebe ne briga za ventilčke na gumah, da se pol zgražaš na une, ki so mu pa pomembni.
Meni je pomembno, da se v digitalnem sistemu začne štet z 0 oz. da ima prvi row id 0. Enim drugim dolv visi, eni tretji pa hočejo da je prvi row z id 1.
Pomembno vprašanje je (bilo), ali je možno autoincrement nastavit, da začne štet z 0. In odgovor je, da se ne da. To se že vse ve.
Ne vem, v čem je point, da če tebe ne briga za ventilčke na gumah, da se pol zgražaš na une, ki so mu pa pomembni.
Meni je pomembno, da se v digitalnem sistemu začne štet z 0 oz. da ima prvi row id 0. Enim drugim dolv visi, eni tretji pa hočejo da je prvi row z id 1.
Pomembno vprašanje je (bilo), ali je možno autoincrement nastavit, da začne štet z 0. In odgovor je, da se ne da. To se že vse ve.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
Utk ::
Zanimivo, da ti je TO tolk pomembno, ostale očitne neoptimalnosti, ki jih vzganjaš, te pa nič ne motijo.
GupeM ::
Well, enega briga barva ventilčkov na gumah od avta, drugega pač ne.
Ne vem, v čem je point, da če tebe ne briga za ventilčke na gumah, da se pol zgražaš na une, ki so mu pa pomembni.
Dokler je nekomu pomembna barva ventilčkov, mi je čisto vseeno. Ko bo pa nekdo hotel ventilčke ki dihtajo, hkrati pa ne bi uporabil sivih, zato ker hoče kodrlajsasto sive, je pa pač bedak. Še posebej, če mu s kodrlajsasto sivimi ventilčki avto potegne 10 - 100x slabše.
Razumeš?
HotBurek ::
Ne vem, kaj te muči? Ego, bralno razumevanje, kaj tretjega...
1. Postavil sem sistem, ki je podatke vnašal z uporabo maxid + 1.
2. Ko sem kasneje vnašal iz dveh različnih procesov, je prihajalo do znane težave...
3. Odprl sem temo na ST, opisal kakšen je trenuten sistem, do kakšne težave prihaja in postavil vprašanje, kakšne so bolj ali manj elegantne rešitve za ta problem.
4. Prvi predlog je bil autoincrement, za katerega vem in mi iz meni znanih, a vam nepojemljivih, razlogov ni kul.
5. Potem ego boost solata.
6. Potem pa je user matevz1337 omenil UUID. In pravi, da je boljši kot autoincrement!
7. Teden dni kasneje uporabim UUID namesto maxid + 1 in lepo poročam o 10x 100x hitrejšem vnosu. I'm happy.
No, in sedaj smo tu. Za dani problem obstajata vsaj dve rešitve, jaz sem izbral UUID, lepo elegantno rešil zadevo, a nekateri še kar prodajate, malo da ne vsiljujete, autoincrement.
1. Postavil sem sistem, ki je podatke vnašal z uporabo maxid + 1.
2. Ko sem kasneje vnašal iz dveh različnih procesov, je prihajalo do znane težave...
3. Odprl sem temo na ST, opisal kakšen je trenuten sistem, do kakšne težave prihaja in postavil vprašanje, kakšne so bolj ali manj elegantne rešitve za ta problem.
4. Prvi predlog je bil autoincrement, za katerega vem in mi iz meni znanih, a vam nepojemljivih, razlogov ni kul.
5. Potem ego boost solata.
6. Potem pa je user matevz1337 omenil UUID. In pravi, da je boljši kot autoincrement!
7. Teden dni kasneje uporabim UUID namesto maxid + 1 in lepo poročam o 10x 100x hitrejšem vnosu. I'm happy.
No, in sedaj smo tu. Za dani problem obstajata vsaj dve rešitve, jaz sem izbral UUID, lepo elegantno rešil zadevo, a nekateri še kar prodajate, malo da ne vsiljujete, autoincrement.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
murrieta ::
Kot rešitev sem uporabil UUID. O tem sem tudi pisal.
Autoincrement pa nisem želel uporabiti iz preprostega razloga. In to je, da začne štet pri 1 in ne 0. V configu se to ne da spremenit.
Se da pa v source kodi od marije.
7. Teden dni kasneje uporabim UUID namesto maxid + 1 in lepo poročam o 10x 100x hitrejšem vnosu. I'm happy.
Tega sem spregledal, zdaj mi je pa se manj jasno. Saj to ves, da lahko zapisujes z autoincrementom in potem beres s `select id - 1 from table`, ne?
Zgodovina sprememb…
- spremenilo: murrieta ()
HotBurek ::
Ja. Gre za first world problem.
Tisti, ki ste C/C++ špica, mogoče lahko na hitro pogledate in pokomentirate, zakaj je tako, in če je možno narediti fix.
Evo ti: https://slo-tech.com/forum/t802167/p762...
Tisto z select id - 1 je pa odlična opcija.
Tisti, ki ste C/C++ špica, mogoče lahko na hitro pogledate in pokomentirate, zakaj je tako, in če je možno narediti fix.
Evo ti: https://slo-tech.com/forum/t802167/p762...
Tisto z select id - 1 je pa odlična opcija.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
murrieta ::
Ja. Gre za first world problem.
Tisti, ki ste C/C++ špica, mogoče lahko na hitro pogledate in pokomentirate, zakaj je tako, in če je možno narediti fix.
Evo ti: https://slo-tech.com/forum/t802167/p762...
Tisto z select id - 1 je pa odlična opcija.
Zgodovina sprememb…
- spremenilo: murrieta ()
win64 ::
Zakaj za boga je važno če se začne z 0 ali se začne z 1. Z id-ji se ja ne boš šel računanja?
Če te moti na frontendu pa lahko to tam rešuješ, recimo s hashi izračunanimi iz integerjev. Youtube recimo ima format: egQt7CD5cQ4.
Te teme so zmeraj na robu trollanja.
Če te moti na frontendu pa lahko to tam rešuješ, recimo s hashi izračunanimi iz integerjev. Youtube recimo ima format: egQt7CD5cQ4.
Te teme so zmeraj na robu trollanja.
kuall ::
Autoincrement mi ni všeč čisto iz estetskega razloga.
In ta je, da začne štet pri 1 in ne 0.
To bi sicer lahko pofixal, in vnesel prva dva row-a na roke, potem pa auto...
To je najbolj debilen od vseh moznih debilnih razlogov zakaj bi sel clovek delat to kar ti delas ali pa kar je kuall pisal. Ne samo da je stokrat pocasnejse, ampak celo ne dela in delas pol neke retrye. Kako ti to ne pove da delas neki narobe? In tudi ce bi delal, kaksen legacy je to. Po cisto vsaki metriki absolutno cvek ideja.
Moram pa rečt, da sem kar malo presenečen, koliko se vas je odzvalo z željo po pumpanju lastnega ego-ta.
Vsakic je isto: Ti se napacno lotis stvari, potem imas problem, odpres temo, folk ti svetuje da cisto spremenis pristop, ti noces poslusat, potem ti nekdo napise neko "resitev" znotraj teh tvojih idej, ki seveda dela k drek, ti si zadovoljen, ostale pa obtozis da imajo ego. Ubistvu imas ti ego, ker ne preneses nobene kritike svojih idej in si nic ne pustis dopovedat.
Odprl si kup tem za zelo kompleksne searche v SQL kjer je ful pomembn relevance in ordering, a nisi pomislil, da bi za to uporabil kak produkt ki je namenjen temu. Ti ne rabis real-time azurnost vpisanih podatkov, ti ne rabis real-time azuriranih indexov.
ne imet izpadov, bumbarček. jaz sem samo razlagal, zakaj ima napako v čist prvem postu v temi, za razliko od tebe, ki imaš neke izpade zarad svoje švoh psihe. btw takih programerjev je ogromno, ki so nesramni, vzvišeni, in tudi zato izgubijo stranke, ker jih stranke ne morejo gledat. bodo raje gledale enega bureka, ki je bolj ponižen, samo zato, da jim ne bo vsak dan pokbaril dneva. jaz pravim, da je dobro razumet stvari, že zato, da bo lahko debuggiral tujo kodo, ki pa uporablja ta pristop, ki ga je hotel burek v prvem postu. jaz uporabljam identity/autoincrement.
a bejž, da je hitrej če ne bereš cele tabele ob vsakem insertu.
max(id) ne bere cele tebele. ne govorit neumnosti. drug razlog je za hitrost kot pa branje cele tabele.
Zgodovina sprememb…
- spremenilo: kuall ()
HotBurek ::
Evo, nov dan, nove resnice.
Dejansko se da imet auto_increment in da je prvi row id 0.
Setting: NO_AUTO_VALUE_ON_ZERO
Dokumentacija: https://dev.mysql.com/doc/refman/5.7/en...
Zakaj za boga je važno če se začne z 0 ali se začne z 1. Z id-ji se ja ne boš šel računanja?
Takšen primer je opisan na zgornjem linku:
For example, if you dump the table with mysqldump and then reload it, MySQL normally generates new sequence numbers when it encounters the 0 values, resulting in a table with contents different from the one that was dumped. Enabling NO_AUTO_VALUE_ON_ZERO before reloading the dump file solves this problem.
Dejansko se da imet auto_increment in da je prvi row id 0.
Setting: NO_AUTO_VALUE_ON_ZERO
Dokumentacija: https://dev.mysql.com/doc/refman/5.7/en...
Zakaj za boga je važno če se začne z 0 ali se začne z 1. Z id-ji se ja ne boš šel računanja?
Takšen primer je opisan na zgornjem linku:
For example, if you dump the table with mysqldump and then reload it, MySQL normally generates new sequence numbers when it encounters the 0 values, resulting in a table with contents different from the one that was dumped. Enabling NO_AUTO_VALUE_ON_ZERO before reloading the dump file solves this problem.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
win64 ::
Po tvojem izseku je to primer, ko imaš v backupu tabelo z ničlami noter.
In to je še dodaten argument zakaj se ne ustavlja default vrednosti v id-je(0, 00000000-0000-0000-0000-000000000000).
Vsak ki bo videl nič v PK/FK bo predvideval, da to ni podatka. Očitno so enakega mnenja tudi pisci baze.
In to je še dodaten argument zakaj se ne ustavlja default vrednosti v id-je(0, 00000000-0000-0000-0000-000000000000).
Vsak ki bo videl nič v PK/FK bo predvideval, da to ni podatka. Očitno so enakega mnenja tudi pisci baze.
Zgodovina sprememb…
- spremenil: win64 ()
HotBurek ::
Vsak ki bo videl nič v PK/FK bo predvideval, da to ni podatka.
Prvič slišim za kaj takega. Iz katere šole izvira tak pristop?
Prvič slišim za kaj takega. Iz katere šole izvira tak pristop?
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
murrieta ::
Evo, nov dan, nove resnice.
Dejansko se da imet auto_increment in da je prvi row id 0.
Setting: NO_AUTO_VALUE_ON_ZERO
Dokumentacija: https://dev.mysql.com/doc/refman/5.7/en...
Zakaj za boga je važno če se začne z 0 ali se začne z 1. Z id-ji se ja ne boš šel računanja?
Takšen primer je opisan na zgornjem linku:
For example, if you dump the table with mysqldump and then reload it, MySQL normally generates new sequence numbers when it encounters the 0 values, resulting in a table with contents different from the one that was dumped. Enabling NO_AUTO_VALUE_ON_ZERO before reloading the dump file solves this problem.
Samo omenim: select 'insert into ' + table + '(id) values (' + id + ');' from table;
In tabelo lahko vedno dropas.
Zgodovina sprememb…
- spremenilo: murrieta ()
win64 ::
Sam tega ne prakticiram, raje uporabim null.
V kakšnih starejših bazah je pa tega veliko. Nisem nikoli raziskoval ali je bila to omejitev baz ali neznanje piscev. Najbrž prva možnost.
V kakšnih starejših bazah je pa tega veliko. Nisem nikoli raziskoval ali je bila to omejitev baz ali neznanje piscev. Najbrž prva možnost.
HotBurek ::
Evo, fantje in dekline. Dobro jutro.
Poročal bom o težki zadevi, zato tisti, ki se hitro vzneburite ob vsaki manjši napakici: Take it easy.
No, takole. Do pred kratkim sem za id uporabljal: UUDI, VARCHAR(36), BTree unique index. Prilezel sem do ene 700.000 vrstic. Tu pa so se začeli INSERT/UPDATE ukazi izvajat vse preveč po požje.
In sem šel na internete iskat, kako drugi optimizirajo situacijo, kjer je UUID primary key.
Dokumentacija:
https://mariadb.com/kb/en/guiduuid-perf...
Na kratko. Dokumentacija govori o "third part" vrednosti za UUID (verzija 1), ki je vezana na čas, in naj se to vrednost uporablja na začetku vrednosti id-ja. Se pravi, iz UUID vrednosti se naj naredi rewrite, preden se to novo vrednost vnese v tabelo/stolpec. Z namenom, da bodo podatki v index-u razvrščeni naraščajoče glede na čas vnos.
Naslednja stvar, ki je omenjena v dokumentaciji, pravi, da VARCHAR(36) ni ok, in je boljše zadevo konvertat v BINARY(16) format in potem to novo vrednost vnesit kot id. Ta vrednost je sicer (za človeško oko) neberljiva, in jo je potrebno ob branju konvertat nazav v VARCHAR(36).
Tule je še ena spletna stran na to temo: https://stitcher.io/blog/optimised-uuid...
In kaj sem naredil? Well, rekel sem si, da je tole z UUID too much komplikacije & šajse za to, kar jaz delam in rabim, ter seveda uvedel custom id generator rešitev.
Id je tipa VARCHAR(18) in izgleda takole:
000000-0-000000000
Sestavljen iz treh sklopov:
000000 = to je shop_id, pred vnosom naredim LPAD(6)
0 = tu shranim bit, s katerim označim url_type; 0=base, 1=xml, 2=page
000000000 = to je page_id, pred vnosom naredim LPAD(9)
Ko se zgodi INSERT, vem za podatek shop_id in url_type.
Za page_id pa naredim:
In ke je najkveč en process per shop_id, SET @page_id = @page_id + 1 ni problem in ne prihaja več do konfliktov za id pri vnosu. Vsak process dela "maxid" znotraj svojega pool-a.
Id potem zgeneriram takole:
In zadeva dela. Trenutno poganjam uvoz (vnešenih je že 250.000 od 700.000), imel sem do max 35 hkratnih processov, več skoraj ne gre, ker je CPU na 100% ali zelo blizu.
Zaenkrat nimam še nobenega error-ja, a morem povedat, da se je INSERT nekoliko upočasnil od začetne turbo hitrosti. We will see.
Pa da ne omenjam te izjemne lepote, ko se id-ji izpišejo:
Na nivoju. Solid!
Poročal bom o težki zadevi, zato tisti, ki se hitro vzneburite ob vsaki manjši napakici: Take it easy.
No, takole. Do pred kratkim sem za id uporabljal: UUDI, VARCHAR(36), BTree unique index. Prilezel sem do ene 700.000 vrstic. Tu pa so se začeli INSERT/UPDATE ukazi izvajat vse preveč po požje.
In sem šel na internete iskat, kako drugi optimizirajo situacijo, kjer je UUID primary key.
Dokumentacija:
https://mariadb.com/kb/en/guiduuid-perf...
Na kratko. Dokumentacija govori o "third part" vrednosti za UUID (verzija 1), ki je vezana na čas, in naj se to vrednost uporablja na začetku vrednosti id-ja. Se pravi, iz UUID vrednosti se naj naredi rewrite, preden se to novo vrednost vnese v tabelo/stolpec. Z namenom, da bodo podatki v index-u razvrščeni naraščajoče glede na čas vnos.
Naslednja stvar, ki je omenjena v dokumentaciji, pravi, da VARCHAR(36) ni ok, in je boljše zadevo konvertat v BINARY(16) format in potem to novo vrednost vnesit kot id. Ta vrednost je sicer (za človeško oko) neberljiva, in jo je potrebno ob branju konvertat nazav v VARCHAR(36).
Tule je še ena spletna stran na to temo: https://stitcher.io/blog/optimised-uuid...
In kaj sem naredil? Well, rekel sem si, da je tole z UUID too much komplikacije & šajse za to, kar jaz delam in rabim, ter seveda uvedel custom id generator rešitev.
Id je tipa VARCHAR(18) in izgleda takole:
000000-0-000000000
Sestavljen iz treh sklopov:
000000 = to je shop_id, pred vnosom naredim LPAD(6)
0 = tu shranim bit, s katerim označim url_type; 0=base, 1=xml, 2=page
000000000 = to je page_id, pred vnosom naredim LPAD(9)
Ko se zgodi INSERT, vem za podatek shop_id in url_type.
Za page_id pa naredim:
# set page id SET @page_id = -1; # get current max page id SELECT MAX(`page_id`) AS 'page_id' INTO @page_id FROM `pages` WHERE `shop_id` = p_shop_id AND `url_type` = 'page'; # if null then set to 0, othervise add 1 to current id IF @page_id IS NULL THEN SET @page_id = 0; ELSE SET @page_id = @page_id + 1; END IF;
In ke je najkveč en process per shop_id, SET @page_id = @page_id + 1 ni problem in ne prihaja več do konfliktov za id pri vnosu. Vsak process dela "maxid" znotraj svojega pool-a.
Id potem zgeneriram takole:
# build id SET @id = CONCAT(LPAD(p_shop_id, 6, '0'), '-2-', LPAD(@page_id, 9, '0'));
In zadeva dela. Trenutno poganjam uvoz (vnešenih je že 250.000 od 700.000), imel sem do max 35 hkratnih processov, več skoraj ne gre, ker je CPU na 100% ali zelo blizu.
Zaenkrat nimam še nobenega error-ja, a morem povedat, da se je INSERT nekoliko upočasnil od začetne turbo hitrosti. We will see.
Pa da ne omenjam te izjemne lepote, ko se id-ji izpišejo:
id ------------------ 000000-0-000000000 000000-1-000000000 000000-1-000000001 000000-1-000000002 000000-1-000000003 000000-2-000000000 000000-2-000000001 000000-2-000000002 000000-2-000000003 000000-2-000000004 000000-2-000000005 000000-2-000000006 000000-2-000000007
Na nivoju. Solid!
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
Utk ::
hbgqzR ::
Ker hoče podatke pomensko enolično strukturirati v eni vrednosti. Ni niti po normalizacijskih pravilih, vendar če pomaga...
Zgodovina sprememb…
- spremenilo: hbgqzR ()
HotBurek ::
Well, obstajata dve opcije, kako klicat row po nekem unique id-ju.
1. Na tabeli je unique index na stolpcu "url", tako da bi lahko uporabljal url string kot ID, ko kličeš single row. Kar pa je, vsaj jaz tako vidim, zelo grdo.
2. Stolpec ID bi z lahkoto odstranil, ter na tabelo postavil UNIQUE INDEX (shop_id, page_id, url_type). Ampak, vsakič, ko bi želel klicat single row, bi moral telovadit s tremi ciframi, namesto z eno.
Kot rečeno, UUID sem uporabljal, a imam občutek, da nekaj ni štimalo (BTree Index, VARCHAR(36)), in bi rabil optimizirat. Tu pa mi ideja, da VARCHAR konvertam v BINARY pred zapisovanjem, potem pred branjem pa konvertam nazaj, ni bila zanimiva. Ter, da v grafičnem vmesniku vidiš neko solato.
In sem šel naprej s to idejo, da ID sestavim iz obsoječih podatkov (številk), kar omogoča, da ima vsak process svoj pool in se telovadba z "maxid" ne prekriva med procesi. ID je lepo berljiv. I like it.
V vednost, stolpci shop_id, page_id in url_type so še vedno tam, isto z podatki kot prej.
1. Na tabeli je unique index na stolpcu "url", tako da bi lahko uporabljal url string kot ID, ko kličeš single row. Kar pa je, vsaj jaz tako vidim, zelo grdo.
2. Stolpec ID bi z lahkoto odstranil, ter na tabelo postavil UNIQUE INDEX (shop_id, page_id, url_type). Ampak, vsakič, ko bi želel klicat single row, bi moral telovadit s tremi ciframi, namesto z eno.
Kot rečeno, UUID sem uporabljal, a imam občutek, da nekaj ni štimalo (BTree Index, VARCHAR(36)), in bi rabil optimizirat. Tu pa mi ideja, da VARCHAR konvertam v BINARY pred zapisovanjem, potem pred branjem pa konvertam nazaj, ni bila zanimiva. Ter, da v grafičnem vmesniku vidiš neko solato.
In sem šel naprej s to idejo, da ID sestavim iz obsoječih podatkov (številk), kar omogoča, da ima vsak process svoj pool in se telovadba z "maxid" ne prekriva med procesi. ID je lepo berljiv. I like it.
V vednost, stolpci shop_id, page_id in url_type so še vedno tam, isto z podatki kot prej.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
2g00d4u ::
Uporaba UUID se mi zdi potrata resursov. Integer zasede majn, index je manjši. Jaz raje uporabljam sequence namesto autoincrement. V default vrednost polja pa nastavim next value from sequence in se obnaša enako kot autoincrement. Je pa zadeva boljša, če delaš kakšne batch inserte, ker si lahko rezerviraš pool idjev in jih sam določiš vrsticam. S tem ni potrebe po ponovnem branju zato da bi dobil id-je.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [SQL] primary key inkrementalno dodajanje (strani: 1 2 )Oddelek: Programiranje | 5381 (4571) | ejresnevem |
» | Učenje programiranja PHPOddelek: Programiranje | 1483 (1024) | Spura |
» | SQL pomočOddelek: Programiranje | 2388 (1802) | miko22 |
» | [Sql] PoizvedbaOddelek: Programiranje | 1816 (1467) | ales85 |
» | [T-SQL] Kako vnest podatek v bazo in da ti hkrati vrne id?Oddelek: Programiranje | 2894 (2612) | dmok |