mysql 效能優化-臨時表
查詢當前建立臨時表的大小
###臨時表 1.show global status like ‘created_tmp%’;
=>Variable_name Value Created_tmp_disk_tables 67842 Created_tmp_files 1430 Created_tmp_tables 327575257
伺服器對臨時表的配置
2.show variables where Variable_name in (‘tmp_table_size’, ‘max_heap_table_size’);
=》Variable_name Value max_heap_table_size 67108864 tmp_table_size 2097152
理論分析:
MySQL在執行SQL查詢時可能會用到臨時表,一般情況下,用到臨時表就意味著效能較低。
臨時表儲存
MySQL臨時表分為“記憶體臨時表”和“磁碟臨時表”,其中記憶體臨時表使用MySQL的MEMORY儲存引擎,磁碟臨時表使用MySQL的MyISAM儲存引擎;
一般情況下,MySQL會先建立記憶體臨時表,但記憶體臨時表超過配置指定的值後,MySQL會將記憶體臨時表匯出到磁碟臨時表;
Linux平臺上預設是/tmp目錄,/tmp目錄小的系統要注意啦。
使用臨時表的場景:
1)ORDER BY子句和GROUP BY子句不同, 例如:ORDERY BY price GROUP BY name;
2)在JOIN查詢中,ORDER BY或者GROUP BY使用了不是第一個表的列 例如:SELECT * from TableA, TableB ORDER BY TableA.price GROUP by TableB.name
3)ORDER BY中使用了DISTINCT關鍵字 ORDERY BY DISTINCT(price)
4)SELECT語句中指定了SQL_SMALL_RESULT關鍵字 SQL_SMALL_RESULT的意思就是告訴MySQL,結果會很小,請直接使用記憶體臨時表,不需要使用索引排序 SQL_SMALL_RESULT必須和GROUP BY、DISTINCT或DISTINCTROW一起使用 一般情況下,我們沒有必要使用這個選項,讓MySQL伺服器選擇即可。
直接使用磁碟臨時表的場景:
1)表包含TEXT或者BLOB列;
2)GROUP BY 或者 DISTINCT 子句中包含長度大於512位元組的列;
3)使用UNION或者UNION ALL時,SELECT子句中包含大於512位元組的列;
臨時表相關配置:
注意:最終的系統建立的記憶體臨時表大小是取上述兩個配置值的最小值。
表的設計原則:
使用臨時表一般都意味著效能比較低,特別是使用磁碟臨時表,效能更慢,因此我們在實際應用中應該儘量避免臨時表的使用。 常見的避免臨時表的方法有:
1)建立索引:在ORDER BY或者GROUP BY的列上建立索引;
2)分拆很長的列:一般情況下,TEXT、BLOB,大於512位元組的字串,基本上都是為了顯示資訊,而不會用於查詢條件, 因此表設計的時候,應該將這些列獨立到另外一張表。
如何判斷使用了臨時表?
使用explain檢視執行計劃,Extra列看到Using temporary就意味著使用了臨時表。