臨時表消耗時間和內存
我們在執行某些SQL語句的時候有可能會生成臨時表.我們應該盡量的去避免臨時表.因為臨時表會浪費內存和時間.那么什么情況下會產生臨時表呢?
If there is an ORDER BY
clause and a different GROUP BY
clause, or if the ORDER BY
or GROUP BY
contains columns from tables other than the first table in the join queue, a temporary table is created.[官方說明]
ORDER BY 子句和一個不一樣的 GROUP BY 子句 或者 ORDER BY 子句和一個不一樣的 GROUP BY 子句,或者 ORDER BY 或 GROUP BY 的列不是來自JOIN語句序列的第一個表,就會產生臨時表.
個人測試后結論 :
1. 如果GROUP BY 的列沒有索引,產生臨時表.
2. 如果GROUP BY時,SELECT的列不止GROUP BY列一個,並且GROUP BY的列不是主鍵 ,產生臨時表.
3. 如果GROUP BY的列有索引,ORDER BY的列沒索引.產生臨時表.
4. 如果GROUP BY的列和ORDER BY的列不一樣,即使都有索引也會產生臨時表.
5. 如果GROUP BY或ORDER BY的列不是來自JOIN語句第一個表.會產生臨時表.
DISTINCT
combined with ORDER BY
may require a temporary table.[官方說明]
DISTINCT 和 ORDER BY 一起使用時可能需要臨時表
個人測試后結論 :
1. 如果DISTINCT 和 ORDER BY的列沒有索引,產生臨時表.
If you use the SQL_SMALL_RESULT
option, MySQL uses an in-memory temporary table, unless the query also contains elements (described later) that require on-disk storage.[官方說明]
用了 SQL_SMALL_RESULT, mysql就會用內存臨時表。
個人測試后結論 :
1. 從來沒用過這個,反正沒生成.
最后再說一下filesort.
filesort 這個名字取得太搓逼了。 filesort的意思是只要一個排序無法使用索引來排序,就叫filesort。他和file沒半毛錢關系。filesort應該叫做sort。意思是說如果無法用已有index來排序,那么就需要數據庫服務器額外的進行數據排序,這樣其實是會增加性能開銷的。