sql產生臨時表


臨時表消耗時間和內存

我們在執行某些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來排序,那么就需要數據庫服務器額外的進行數據排序,這樣其實是會增加性能開銷的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM