在相同業務情境下,架構設計和庫表索引設計會影響查詢效能,良好的設計可以提高查詢效能,反之會出現很多慢SQL(執行時間很長的SQL語句)。本文介紹導致慢SQL的原因和解決方案。
SQL異常
- 原因及現象
SQL異常的原因很多,例如庫表結構設計不合理、索引缺失、掃描行數太多等。
您可以在控制台的SQL洞察頁面,查看慢SQL的執行耗時、執行次數等資訊。
- 解決方案
根據實際業務情況最佳化SQL。具體操作,請參見SQL最佳化。
執行個體瓶頸
版本升級
- 原因及現象
執行個體升級版本可能會導致SQL執行計畫發生改變,執行計畫中連線類型從好到壞的順序是system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>all。更多資訊,請參見MySQL官方文檔。
range和index連線類型時,如果SQL請求變慢,業務又不斷重發請求,導致並行SQL查詢比較多,會導致應用線程釋放變慢,最終串連池耗盡,影響整個業務。
您可以在控制台的監控與警示頁面,單擊標準監控頁簽,在資源監控內可以查看執行個體的串連數情況。
- 解決方案
根據執行計畫分析索引使用方式、掃描的行數等,預估查詢效率,重構SQL語句、調整索引,提升查詢效率。具體操作,請參見SQL最佳化。
參數設定不當
- 原因及現象
參數innodb_buffer_pool_instances、join_buffer_size等設定不當會導致效能變慢。
您可以在控制台的參數設定頁面,單擊修改歷史頁簽,查看執行個體的參數修改情況。
- 解決方案
調整相關參數,使其適合業務情境。
緩衝失效
- 原因及現象
緩衝可以很好地承擔大量查詢,但是並不能保證快取命中率100%,如果緩衝失效,也會有大量的查詢路由到資料庫端,導致效能下降。
您可以在控制台的監控與警示頁面,單擊標準監控頁簽,在引擎監控內可以查看執行個體的快取命中率、QPS、TPS等。
- 解決方案
可以使用Thread Pool、Fast Query Cache、自動SQL限流等功能提高效能。
大量操作
- 原因及現象
如果有大批量的資料匯入、刪除、查詢操作,會導致SQL執行變慢。
可以從磁碟空間、SQL洞察或者慢查詢裡找到對應語句。例如查看Binlog大小,正常情況單個Binlog大小是500 MB,如果有超過500 MB的,可以查看是否有異常。
您也可以在控制台的監控與警示頁面,單擊標準監控頁簽,在資源監控和引擎監控內可以查看執行個體的磁碟空間、IOPS、事務等情況。
- 解決方案
在業務低峰期執行大大量操作,或將大大量操作拆分後分批執行。
未關閉事務
- 原因及現象
如果某個任務突然變慢,查看CPU和IOPS的使用率並不高,而且活躍會話持續增多,通常是因為存在未關閉的事務。
- 解決方案
檢查導致事務衝突的鎖並中止對應的SQL語句。
定時任務
- 原因及現象如果執行個體負載隨時間有規律性變化,可能是存在定時任務。說明 您可以在監控與警示頁面的標準監控頁簽查看相關監控資訊。
- 解決方案
調整定時任務的執行時間,建議在業務低峰期執行。
總結
RDS上定位慢SQL的主要方法如下:
結合RDS提供的這些功能,可以有效協助您快速定位甚至自動解決慢SQL問題。