MySQL臨時表的優化方案

sunlovesi發表於2016-07-24

MySQL 是全球最受歡迎的開源資料庫,作為開源軟體組合 LAMP(Linux + Apache + MySQL
+ Perl/PHP/Python)中的重要一環,廣泛應用於各類應用。Web2.0
時代,風靡全網的社群論壇軟體系統 Discuz 和部落格平臺 WordPress 均基於 MySQL 實現底層架構。Web3.0 時代,阿里巴巴、Facebook、Google 等大型網際網路公司都採用更為靈活的
MySQL 構建了成熟的大規模資料庫叢集。阿里雲資料庫
MySQL 版基於 Alibaba 的 MySQL 原始碼分支,經過雙 11 高併發、大資料量的考驗,擁有優良的效能和吞吐量。除此之外,阿里雲資料庫 MySQL 版還擁有經過優化的讀寫分離、資料壓縮、智慧調優等高階功能。

在雲資料庫RDS for MySQL存在臨時表的概念。包含“記憶體臨時表”和“磁碟臨時表”兩種,其中記憶體臨時表可以在控制檯上通過tmp_table_size來設定其大小,通過這個設定可以將臨時結果儲存在記憶體中以供呼叫。當session生成的臨時內容超過了記憶體臨時表的配額後就會將記憶體臨時表的資料轉存到磁碟臨時表。磁碟臨時表由於需要通過磁碟物理檔案來存放,會導致SQL的執行效率降低,因此需要儘量去避免這種現象的發生。

而下面的這些使用場景一定會使用到臨時表:

1) 表包含TEXT或者BLOB列;

2) GROUP BY 或者 DISTINCT 子句中包含長度大於512位元組的列;

3) 使用UNION或者UNION ALL時,SELECT子句中包含大於512位元組的列。

可使用explain檢視執行計劃,Extra列看到Using temporary就意味著使用了臨時表。

使用者可以通過以下方式來對其優化:

1) 對group by和order by的列進行優化,新增索引;

2) 將較大的TEXT或者BLOB列拆分成多個較小的列;

3) 對大量的group by和order by語句做拆分;

4) 優化業務邏輯。


參考 

RDS mysql臨時表的優化方案



相關文章