通過設(shè)置tmp_table_size選項(xiàng)來增加一張臨時(shí)表的大小,例如做高級GROUP BY操作生成的臨時(shí)表。如果調(diào)高該值,MySQL同時(shí)將增加heap表的大小,可達(dá)到提高聯(lián)接查詢速度的效果,建議盡量優(yōu)化查詢,要確保查詢過程中生成的臨時(shí)表在內(nèi)存中,避免臨時(shí)表過大導(dǎo)致生成基于硬盤的MyISAM表。
mysql> show global status like ‘created_tmp%‘;
+——————————–+———+
| Variable_name | Value |
+———————————-+———+
| Created_tmp_disk_tables | 21197 |
| Created_tmp_files | 58 |
| Created_tmp_tables | 1771587 |
+——————————–+———–+
每次創(chuàng)建臨時(shí)表,Created_tmp_tables增加,如果臨時(shí)表大小超過tmp_table_size,則是在磁盤上創(chuàng)建臨時(shí)表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服務(wù)創(chuàng)建的臨時(shí)文件文件數(shù),比較理想的配置是:
Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%比如上面的服務(wù)器Created_tmp_disk_tables / Created_tmp_tables * 100% =1.20%,應(yīng)該相當(dāng)好了
默認(rèn)為16M,可調(diào)到64-256最佳,線程獨(dú)占,太大可能內(nèi)存不夠I/O堵塞
如果動(dòng)態(tài)頁面要調(diào)大點(diǎn),100M以上,如果網(wǎng)站大部分都是靜態(tài)內(nèi)容,一般64M足夠。
tmp_table_size優(yōu)化
數(shù)據(jù)庫連接突然增多到1000的問題
查看了一下,未有LOCK操作語句。
但是明顯有好多copy to tmp table的SQL語句,這條語讀的時(shí)間比較長,且這個(gè)表會被加讀鎖,相關(guān)表的update語句會被排進(jìn)隊(duì)列。如果多執(zhí)行幾次這樣的copyt to tmp table 語句,會造成更多的語句被阻塞。
連接太多造成mysql處理慢。
copy to tmp talbe 語句產(chǎn)生的原因是查詢需要Order By 或者Group By等需要用到結(jié)果集時(shí),參數(shù)中設(shè)置的臨時(shí)表的大小小于結(jié)果集的大小時(shí),就會將該表放在磁盤上,這個(gè)時(shí)候在硬盤上的IO要比內(nèi)銷差很多。所耗費(fèi)的時(shí)間也多很多。另外Mysql的另外一個(gè)參數(shù)max_heap_table_size比tmp_table_size小時(shí),則系統(tǒng)會把max_heap_table_size的值作為最大的內(nèi)存臨時(shí)表的上限,大于這個(gè)時(shí),改寫硬盤。
我們的mysql這兩個(gè)參數(shù)為:
tmp_table_size 33554432 (33.5M)
max_heap_table_size 16777216 (16.7M)
比較小。
建議增加到上百M(fèi)。我們的內(nèi)存應(yīng)該夠吧。
另外join_buffer_size(影響 表之間join性能的緩存)為131072 (131K)較小,可以增加一點(diǎn)。
[root@mail ~]# vi /etc/my.cnf
[mysqld]
tmp_table_size=200M
mysql> show processlist;
mysql> show columns from wp_posts;
SQL 語句的第一個(gè) LEFT JOIN ON 子句中: LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid _mydata 的 userid 被參與了條件比較運(yùn)算。為 _mydata 表根據(jù)字段 userid 建立了一個(gè)索引: mysql> ALTER TABLE `_mydata` ADD INDEX ( `userid` ) 增加 tmp_table_size 值。
新聞熱點(diǎn)
疑難解答
圖片精選