mysql insert慢_MySQL insert语句慢查询的优化
近期發現MySQL slow log 里面有很多慢查詢,而分析慢查詢日志發現大量的慢查詢是insert語句的。在高峰期(早上10點左右)半小時的慢查詢量可以到28G左右。遂決定優化
優化方法:
1、 一個客戶端在一個時候要插多條數據,那么用多個values
insert into t1 values(...),(...),(...)
如果是往一個非空的表里插數據,可調節bulk_insert_buffer_size(缺省為8388608字節=8M)
2、 如果多個客戶端在同時插許多條數據,那么用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來說,在可以使用方法3時,不需用此方法2。
3、對Myisam表來說,如果一個表中間沒有刪除過數據,那么,在Select語句執行時,可以同時執行insert語句將數據插在文件最后。
concurrent_insert必須為1(缺省就是1)
4、從文本文件執行load data infile一般要比用insert語句快20倍。
如果表有索引,可以先去掉索引,load完后,再加上索引。可以提高速度(相比load同時建索引,可以減少disk seek)。
這個事后建索引的方法在msisam表為空時自動執行。
5、如果插入多條語句,可以先lock tables t write,插入后再unlock tables(索引會只flush一次); 但如果當中只有1條insert,那么不需要。
6、要提高Myisam表的load data和insert速度,可提高key_buffer_size(缺省為8M)
如果機器有256M以上內存,那么可以設key_buffer_size為64M,table_open_cache可以調高為256(缺省為64)
如果有128M以上內存,可以設key_buffer_size為16M
總結
以上是生活随笔為你收集整理的mysql insert慢_MySQL insert语句慢查询的优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql的服务器在什么模式下工作_My
- 下一篇: mysql 实体关系表_实体关系图