Jeg har nogle filer med 64 bit tal som jeg skal have læst ind i en database. Hver række består af 2x 64 bit tal. Der er ca 67-68 millioner rækker i 1 fil. (1 GB data). Jeg havde tænkt mig at dele det op i flere tabeller, men der vil alligevel forekomme omkring 200-300 millioner rækker i hver tabel.
Mit problem er dog bare at mysql har lidt svært ved at håndtere så store datamængder.
Strukturen på tabellen er som følgende: CREATE TABLE `z_chains_999` ( `startingpoint` bigint(8) unsigned NOT NULL, `endingpoint` bigint(8) unsigned NOT NULL, PRIMARY KEY (`startingpoint`,`endingpoint`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Rækkerne bliver indsat i bundter af 250.000 (INSERT INTO z_chains_999 (startingpoint, endingpoint) VALUES ([data]),([data]),...) Endnu flere rækker der er i tabellen, des længere tid tager det at indsætte nye, da MySQL skal tjekke om der er nogle nøgler der optræder flere gange (Dette er vigtigt, da det kan forekomme!). Når alle data er i tabellen skal de trækkes ud, sorteret efter 'endingpoint' ASC. Er det muligt at få MySQL til at indsætte dataene i allerede sorteret rækkefølge i tabellen? (sorteret efter endingpoint) Det kan muligvis få det til at gå hurtigere, da den så ikke skal skanne hele tabellen igennem efter duplikat nøgler, for hver række der indsættes. Hvad kan man ellers gøre for yderligere at få noget ekstra performance?
Det eneste index der er, er primary key (startinpoint, endingpoint). Jeg indlæser dataene med kommandoen LOAD DATA INFILE ... Efter 1 times tid er den ca. færdig med 30 millioner rækker.. Men det virker som om at det tager ekspotienlt længere tid at indsætte rækker, des flere der er i tabellen. Dette problem vil jeg gerne uden om
Min disk er defragmenteret. Som sagt så er problemet at den er længere og længere tid om det, des flere rækker der er i tabellen. Så vidt jeg kan forstå, så er problemet at jeg har en primary key. Primary key SKAL være unik, så den skanner alle rækkerne igennem for en lignende række før rækken bliver indsat. Jo flere rækker der kommer, des længere tid tager dette. Så når jeg kommer op på > 30 millioner rækker, så tager det en KRIG at indsætte flere rækker.. Jeg tør slet ikke tænke på 200 millioner rækker..
Data fylder jo mere end 1 GB, så dvs at vi skal have noget med 4 eller 8 GB ram i maskinen.. Vil der være et performance gain ved at skifte til en x64 processor, da det jo er 64 bit tal som der er i tabellerne?
Jeg har lavet en lille applikation der tager tid på hvor lang tid det tager at indsætte rækker i tabellen. Nedenstående er resultatet. Det bliver her bekræftet at des flere rækker der er, des længere tid tager det. På dette tidspunkt er rammene ikke engang fyldt op endnu, så dette er ikke problemet.. Den indsætter 250.000 rækker af gangen, og tallet i venstre side angiver hvor mange rækker der på pågældende tidspunkt er indsat i tabellen totalt set.
resulatet er: 1) jeg observerer det samme som du gør nemlig at tiden for at indsætte 250000 rækker stiger voldsomt 2) det er langt hurtigere at indsætte alle rækker i en tabel uden PK og så tilføje PK bagefter
med PK:
2,3 seconds to add 250000 records 2,9 seconds to add 250000 records 3,4 seconds to add 250000 records 3,7 seconds to add 250000 records 7,6 seconds to add 250000 records 11,3 seconds to add 250000 records 16,2 seconds to add 250000 records 21,2 seconds to add 250000 records
uden PK med PK bagefter:
0,5 seconds to add 250000 records 0,5 seconds to add 250000 records 0,5 seconds to add 250000 records 0,5 seconds to add 250000 records 0,5 seconds to add 250000 records 0,5 seconds to add 250000 records 0,5 seconds to add 250000 records 0,5 seconds to add 250000 records 17,0 seconds to add PK
lidt googling fandt yderliger een interessant mulighed
CREATE TABLE ... DELAY_KEY_WRITE=1;
med den (og PK):
2,1 seconds to add 250000 records 2,3 seconds to add 250000 records 2,3 seconds to add 250000 records 2,4 seconds to add 250000 records 2,4 seconds to add 250000 records 2,4 seconds to add 250000 records 2,5 seconds to add 250000 records 2,5 seconds to add 250000 records
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.