Avatar billede mwj2007 Nybegynder
05. april 2007 - 13:11 Der er 13 kommentarer

Optimering a MySQL til store tabeller

Hej der.

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?
Avatar billede arne_v Ekspert
05. april 2007 - 15:13 #1
har du et index paa endingpoint ?
Avatar billede arne_v Ekspert
05. april 2007 - 15:18 #2
hvor lang tid tager det at loade 67-68 mio. raekker ?
Avatar billede mwj2007 Nybegynder
05. april 2007 - 16:20 #3
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
Avatar billede arne_v Ekspert
05. april 2007 - 16:33 #4
et index paa endingpoint kan muligvis hjaelpe paa SELECT ... ORDER BY endingpoint ASC
Avatar billede arne_v Ekspert
05. april 2007 - 16:38 #5
med hensyn til INSERT - er din disk fragmenteret ?
Avatar billede mwj2007 Nybegynder
05. april 2007 - 17:30 #6
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..
Avatar billede arne_v Ekspert
05. april 2007 - 18:58 #7
den scanner ikke alle raekker igennem - der er index paa primary key

og derfor boer:

insert tid = konstant * log(antal raekker)

d.v.s. ikke vokse specielt hurtigt.

Hvor meget memory giver du MySQL ?
Avatar billede mwj2007 Nybegynder
05. april 2007 - 19:37 #8
Jeg har 2GB ram i maskinen, så den har fået 1GB i key_buffer

[mysqld]
port        = 3306
socket        = /tmp/mysql.sock
skip-locking
key_buffer = 1000M
max_allowed_packet = 16M
table_cache = 512
sort_buffer_size = 10M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 4
bulk_insert_buffer_size = 32M
Avatar billede mwj2007 Nybegynder
05. april 2007 - 19:39 #9
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?
Avatar billede mwj2007 Nybegynder
06. april 2007 - 10:03 #10
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.

250000 chains inserted [2 seconds]
500000 chains inserted [2 seconds]
750000 chains inserted [1 seconds]
1000000 chains inserted [2 seconds]
1250000 chains inserted [3 seconds]
1500000 chains inserted [3 seconds]
1750000 chains inserted [4 seconds]
2000000 chains inserted [4 seconds]
2250000 chains inserted [6 seconds]
2500000 chains inserted [6 seconds]
2750000 chains inserted [6 seconds]
3000000 chains inserted [7 seconds]
3250000 chains inserted [12 seconds]
3500000 chains inserted [9 seconds]
3750000 chains inserted [9 seconds]
4000000 chains inserted [9 seconds]
4250000 chains inserted [11 seconds]
4500000 chains inserted [11 seconds]
4750000 chains inserted [11 seconds]
5000000 chains inserted [12 seconds]
5250000 chains inserted [13 seconds]
5500000 chains inserted [13 seconds]
5750000 chains inserted [14 seconds]
6000000 chains inserted [15 seconds]
6250000 chains inserted [15 seconds]
6500000 chains inserted [15 seconds]
6750000 chains inserted [16 seconds]
7000000 chains inserted [23 seconds]
7250000 chains inserted [17 seconds]
7500000 chains inserted [30 seconds]
7750000 chains inserted [19 seconds]
8000000 chains inserted [18 seconds]
8250000 chains inserted [20 seconds]
8500000 chains inserted [20 seconds]
8750000 chains inserted [20 seconds]
9000000 chains inserted [21 seconds]
9250000 chains inserted [22 seconds]
9500000 chains inserted [23 seconds]
9750000 chains inserted [23 seconds]
10000000 chains inserted [24 seconds]
10250000 chains inserted [24 seconds]
10500000 chains inserted [26 seconds]
10750000 chains inserted [26 seconds]
11000000 chains inserted [27 seconds]
11250000 chains inserted [27 seconds]
11500000 chains inserted [28 seconds]
11750000 chains inserted [29 seconds]
Avatar billede arne_v Ekspert
23. april 2007 - 03:27 #11
jeg har eksperimenteret lidt

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

jeg ved så ikke om du kan bruge det til noget
Avatar billede arne_v Ekspert
23. april 2007 - 04:02 #12
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

tiden stiger men ikke vildt meget
Avatar billede arne_v Ekspert
17. juni 2007 - 05:32 #13
OK ?
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester