近期發現MySQL slow log 裏面有不少慢查詢,而分析慢查詢日誌發現大量的慢查詢是insert語句的。在高峯期(早上10點左右)半小時的慢查詢量能夠到28G左右。遂決定優化數據庫
優化方法:優化
一、 一個客戶端在一個時候要插多條數據,那麼用多個values線程
insert into t1 values(...),(...),(...)日誌
若是是往一個非空的表裏插數據,可調節bulk_insert_buffer_size(缺省爲8388608字節=8M)索引
二、 若是多個客戶端在同時插許多條數據,那麼用insert delayed語句內存
利:客戶端立刻返回,數據排成一隊;數據整齊的寫到一個塊裏,而不是分散。資源
弊:若是這個表被查獲刪數據,那麼插入會變慢,另外,爲這個表起一個handler線程來處理這些數據也要耗費一些額外資源it
待插的數據放在內存裏,一旦數據庫被意外終止(如kill -9),那麼數據會丟失。table
這個方法只適用於myisam,memory,archive,blackhole引擎類表。file
可調節delayed_insert_limit(缺省爲一次100條)
delayed_insert_timeout(缺省爲300)秒內,若無新的insert delayed語句,則handler線程退出。
delayed_queue_size(缺省爲1000條)一旦滿了,客戶端的insert delayed會阻塞。
比第一個方法要慢。
並且對Myisam來講,在可使用方法3時,不需用此方法2。
三、對Myisam表來講,若是一個表中間沒有刪除過數據,那麼,在Select語句執行時,能夠同時執行insert語句將數據插在文件最後。
concurrent_insert必須爲1(缺省就是1)
四、從文本文件執行load data infile通常要比用insert語句快20倍。
若是表有索引,能夠先去掉索引,load完後,再加上索引。能夠提升速度(相比load同時建索引,能夠減小disk seek)。
這個過後建索引的方法在msisam表爲空時自動執行。
五、若是插入多條語句,能夠先lock tables t write,插入後再unlock tables(索引會只flush一次); 但若是當中只有1條insert,那麼不須要。
六、要提升Myisam表的load data和insert速度,可提升key_buffer_size(缺省爲8M)
若是機器有256M以上內存,那麼能夠設key_buffer_size爲64M,table_open_cache能夠調高爲256(缺省爲64)
若是有128M以上內存,能夠設key_buffer_size爲16M