1. 程式人生 > >mysql 效能優化-臨時表

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就意味著使用了臨時表。