MySQL中關於insert語句速度的優化

MySQL中關於insert語句速度的優化

時間: 2010-11-08 11:28:15來源: 網絡 作者: 未知 點擊: 147
1.分析
插入一行分下面幾個動作,括號後面是其大約比例額
Connecting(3)
Sendint query to server(2)
Parsing query(2)
Inserting row(1*size of row)
Inserting indexes(1*number of indexes)
Closing(1)
插入索引的速度隨表

1.分析
插入一行分下面幾個動作,括號後面是其大約比例額
Connecting(3)
Sendint query to server(2)
Parsing query(2)
Inserting row(1*size of row)
Inserting indexes(1*number of indexes)
Closing(1)
插入索引的速度隨表的大小減慢,LogN

2.優化方法
a. 一個客戶端在一個時候要插多條數據,那麼用多個values
insert into t1 values(...),(...),(...)
如果是往一個非空的表裏插數據,可調節bulk_insert_buffer_size(缺省爲8388608字節=8M)
b. 如果多個客戶端在同時插許多條數據,那麼用insert delayed語句
利:客戶端馬上返回,數據排成一隊;數據整齊的寫到一個塊裏,而不是分散。
弊:如果這個表被查獲刪數據,那麼插入會變慢,另外,爲這個表起一個handler線程來處理這些數據也要耗費一些額外資源
待插的數據放在內存裏,一旦數據庫被意外終止(如kill -9),那麼數據會丟失。
這個方法只適用於myisam,memory,archive,blackhole引擎類表。
可調節delayed_insert_limit(缺省爲一次100條)
delayed_insert_timeout(缺省爲300)秒內,若無新的insert delayed語句,則handler線程退出。
delayed_queue_size(缺省爲1000條)一旦滿了,客戶端的insert delayed會阻塞。
比第一個方法要慢。
而且對Myisam來說,在可以使用方法c時,不需用此方法b。
c. 對Myisam表來說,如果一個表中間沒有刪除過數據,那麼,在Select語句執行時,可以同時執行insert語句將數據插在文件最後。
concurrent_insert必須爲1(缺省就是1)
d. 從文本文件執行load data infile一般要比用insert語句快20倍。
如果表有索引,可以先去掉索引,load完後,再加上索引。可以提高速度(相比load同時建索引,可以減少disk seek)。
這個事後建索引的方法在msisam表爲空時自動執行。
e. 如果插入多條語句,可以先lock tables t write,插入後再unlock tables(索引會只flush一次); 但如果當中只有1條insert,那麼不需要。
f. 要提高Myisam表的load data和insert速度,可提高key_buffer_size(缺省爲8M)
如果機器有256M以上內存,那麼可以設key_buffer_size爲64M,table_open_cache可以調高爲256(缺省爲64)
如果有128M以上內存,可以設key_buffer_size爲16M

3.測試情況:
表t(id int auto_increment primary key,content1 varchar(30),content2 int);
create index ind_of_t on t(content1);

a. 單條插入空表:
1千條,耗時:24秒
5千條,耗時:160秒
1萬條,耗時:277秒

b. 一次1000個values list插空表
1千條,耗時:2秒
5千條,耗時:6秒
1萬條,耗時:11秒
5萬條,耗時:51秒
10萬條,耗時:99秒

c. 10個線程同時插空表,一次1000個values list
4,Begin ...
8,Begin ...
6,Begin ...
0,Begin ...
7,Begin ...
9,Begin ...
3,Begin ...
5,Begin ...
2,Begin ...
6,1千條,耗時:6秒
3,1千條,耗時:5秒
9,1千條,耗時:6秒
8,1千條,耗時:7秒
2,1千條,耗時:7秒
5,1千條,耗時:7秒
0,1千條,耗時:10秒
1,Begin ...
4,1千條,耗時:12秒
1,1千條,耗時:2秒
7,1千條,耗時:17秒
6,5千條,耗時:27秒
2,5千條,耗時:28秒
5,5千條,耗時:30秒
4,5千條,耗時:31秒
0,5千條,耗時:34秒
8,5千條,耗時:35秒
7,5千條,耗時:36秒
1,5千條,耗時:30秒
9,5千條,耗時:46秒
3,5千條,耗時:49秒
2,1萬條,耗時:49秒
8,1萬條,耗時:60秒
7,1萬條,耗時:61秒
0,1萬條,耗時:63秒
5,1萬條,耗時:65秒
6,1萬條,耗時:67秒
1,1萬條,耗時:61秒
4,1萬條,耗時:79秒
3,1萬條,耗時:78秒
9,1萬條,耗時:84秒
6,5萬條,耗時:275秒
1,5萬條,耗時:285秒
0,5萬條,耗時:306秒
8,5萬條,耗時:314秒
2,5萬條,耗時:316秒
4,5萬條,耗時:330秒
5,5萬條,耗時:351秒
3,5萬條,耗時:364秒
9,5萬條,耗時:377秒
7,5萬條,耗時:403秒
6,10萬條,耗時:552秒
6,End
0,10萬條,耗時:558秒
0,End
1,10萬條,耗時:573秒
1,End
4,10萬條,耗時:615秒
4,End
3,10萬條,耗時:615秒
3,End
5,10萬條,耗時:623秒
5,End
8,10萬條,耗時:625秒
8,End
7,10萬條,耗時:643秒
7,End
9,10萬條,耗時:648秒
9,End
2,10萬條,耗時:654秒
2,End

d. 10個線程同時插表(已有100萬條記錄),一次1000個values list,再插900萬條記錄
5,Begin ...on 1236937010秒
1,Begin ...on 1236937010秒
8,Begin ...on 1236937010秒
4,Begin ...on 1236937010秒
7,Begin ...on 1236937010秒
2,Begin ...on 1236937010秒
3,Begin ...on 1236937010秒
9,Begin ...on 1236937010秒
0,Begin ...on 1236937011秒
6,Begin ...on 1236937011秒
8,10萬條,耗時:499秒
0,10萬條,耗時:518秒
3,10萬條,耗時:519秒
7,10萬條,耗時:556秒
9,10萬條,耗時:565秒
2,10萬條,耗時:578秒
5,10萬條,耗時:654秒
1,10萬條,耗時:709秒
0,20萬條,耗時:1006秒
9,20萬條,耗時:1070秒
3,20萬條,耗時:1091秒
8,20萬條,耗時:1141秒
5,20萬條,耗時:1146秒
2,20萬條,耗時:1157秒
7,20萬條,耗時:1185秒
1,20萬條,耗時:1291秒
0,30萬條,耗時:1510秒
3,30萬條,耗時:1616秒
9,30萬條,耗時:1649秒
7,30萬條,耗時:1690秒
8,30萬條,耗時:1701秒
5,30萬條,耗時:1767秒
1,30萬條,耗時:1778秒
2,30萬條,耗時:1898秒
0,40萬條,耗時:2066秒
3,40萬條,耗時:2109秒
8,40萬條,耗時:2197秒
9,40萬條,耗時:2213秒
1,40萬條,耗時:2235秒
5,40萬條,耗時:2266秒
0,50萬條,耗時:2461秒
3,50萬條,耗時:2502秒
9,50萬條,耗時:2607秒
1,50萬條,耗時:2655秒
8,50萬條,耗時:2663秒
5,50萬條,耗時:2739秒
3,60萬條,耗時:2876秒
0,60萬條,耗時:2921秒
1,60萬條,耗時:3055秒
8,60萬條,耗時:3101秒
5,60萬條,耗時:3178秒
9,60萬條,耗時:3201秒
3,70萬條,耗時:3312秒
0,70萬條,耗時:3358秒
1,70萬條,耗時:3437秒
8,70萬條,耗時:3523秒
9,70萬條,耗時:3645秒
5,70萬條,耗時:3694秒
3,80萬條,耗時:3731秒
0,80萬條,耗時:3799秒
8,80萬條,耗時:3906秒
1,80萬條,耗時:3915秒
5,80萬條,耗時:4062秒
3,90萬條,耗時:4101秒
3,End
0,90萬條,耗時:4209秒
0,End
8,90萬條,耗時:4227秒
8,End
1,90萬條,耗時:4241秒
1,End
5,90萬條,耗時:4288秒
5,End

 

 

 

 

zz from http://edu.codepub.com/2010/1108/27002.php

 

發佈了37 篇原創文章 · 獲贊 11 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章