在乙個風和日麗的下午,奮哥哥突然接到業務方線上業務資料庫cpu資源告警資訊,立馬放下手裡的枸杞登入業務方阿里雲控制台檢視具體問題。
對於資料庫當前正在發生中的問題,我們首先從資料庫實時會話資訊中嘗試抓取有效資訊,可以看到該告警例項的會話已經出現堆積狀態,大量會話處於"sending data"狀態且從time欄位可以看到這些會話長時間執行未結束。會話長時間執行表示當前會話一直占用的資料庫資源未釋放,且堆積會話基本為同一型別的業務sql,這也就是導致我們資料庫資源打高的問題sql。
我們拎出這個問題sql登入資料庫檢視sql的執行計畫,對問題sql進行分析,從sql執行計畫中我們很明顯發現乙個資源消耗比較大的操作"all"全表掃瞄操作,而且比較詭異的一點是,a表進行表關聯possible_keys明明是primary但是卻沒有使用,所以我們下一步的方向就是排查為什麼表關聯沒有有效利用索引。
1)傳遞資料型別和字段型別不一致
2)關聯字段型別不一致
3)關聯字段字符集不一致
4)校驗規則不一致
在表關聯字段索引失效的情況下,可能導致索引失效的場景主要是2~4,於是我們馬上檢視表關聯字段相關資訊進行一一驗證。emmmm,查詢到的結果卻似乎有些不盡人意,表關聯欄位均是bigint型別,完美的規避掉了以上所有可能。
再次陷入沉思,在沒有發生隱式轉換的情況下索引一般都是會有效利用的,除非mysql優化器認為all全表掃瞄的效率並不差。我們知道,mysql優化器會通過具體表的統計資訊基於cbo進行代價計算,幫我們選擇最佳執行計畫。但是統計資訊並不是完全精確的,某些時候可能會出現一定的誤差,也正是因為統計資訊的誤差,就可能導致mysql優化器錯誤的選擇乙個並不是很好的"最佳執行計畫"。接下來我們就可以進一步檢視表的統計資訊以及hint進行驗證。
表關聯對應的統計資訊
通過hint強制走primary索引觀察執行計畫、並測試執行效率
問題排查到這裡,導致該sql大量消耗cpu資源的原因也就水落石出了。對於業務方目前的cpu打高的情況,我們可以建議業務方先將目前堆積的會話進行kill,避免影響其他正常的業務查詢,等資料庫cpu資源有所回落後,在資料庫執行"analyze table"對問題表的統計資訊重新採集,統計資訊更新後mysql優化器就可以正確的選擇最佳執行計畫。
統計資訊更新:
執行計畫更新:
雖然客戶的問題已經處理,對於本案例還是有一些點值得我們思考:
索引失效的場景都有哪些?
隱式轉換
統計資訊不準確
mysql統計資訊是如何更新採集?
在mysql中有一些引數設定決定了統計資訊採集的行為方式,一般情況下不會做特別設定,我們需要正確的理解這些引數,明白統計資訊只是乙個統計估計值,並不是絕對精準。
統計資訊相關引數
innodb_stats_method 預設nulls_equal,表示統計資訊時把所有的null當作等值對待
innodb_stats_auto_recalc 是否開啟自動化採集統計資料 ,預設開啟,當表資料量更新10%觸發重新採集統計資訊
innodb_stats_on_metadata 預設關閉,若該引數開啟時表示資料庫執行"show table status",訪問"information_schema.tables or
information_schema.statistics"時,都會觸發重新採集統計資訊的操作
innodb_stats_persistent 統計資訊是否持久化到磁碟,預設開啟。持久化磁碟當資料庫重新啟動後可從磁碟讀取。
innodb_stats_persistent_sample_pages 預設20,對於持久化儲存統計資訊的表,每次重新採集資訊需要採集20個索引頁進行分析
innodb_stats_transient_sample_pages 預設8,對於非持久化的表,其統計資訊重新採集需要掃瞄8個索引頁進行分析
mysql幾種重新採集統計資訊的時機
新開啟一張表時
表資料變更超過10%觸發該錶的統計資訊重新採集
當innodb_stats_on_metadata引數開啟,資料庫執行"show table status",訪問"information_schema.tables or information_schema.statistics"時
手動執行analyze tables時
關於analyze table操作
執行該操作需要具有該錶的select/insert許可權
支援innodb、myisam、ndb儲存引擎下的表,不支援檢視
支援對分割槽表中某個分割槽單獨執行統計分析:alter table ... analyze partition在執行analyze期間,會對該錶加乙個讀鎖。
探尋完技術的真理後,奮哥哥又拿起了曾經放下的枸杞。
SQL統計資訊解釋
sql基礎 統計資訊解釋 在平時優化sql的時候,最長用的就是 set statistics on,它可以用來檢視我們寫的查詢語句到底效能如何,不過,究竟這個效能的指標是怎麼樣的呢?首先需要明白的,就是各項資料的意義。輸出項含義 table 表的名稱。scan count 執行的掃瞄次數。logic...
SQL效能 統計資訊
一 統計資訊 統計資訊主要是描述資料庫中表 索引的大小,規模,資料分布狀況等的一類資訊。last analyzed欄位表示上次統計資訊蒐集的時間,可以根據這個字段快速的了解最近一次統計資訊蒐集的時間。二 收集統計資訊的方法 1 使用gather stats job自動收集 在建立資料庫時自動建立,由...
SQL基礎 統計資訊解釋
在平時優化sql的時候,最長用的就是 set statistics on,它可以用來檢視我們寫的查詢語句到底效能如何,不過,究竟這個效能的指標是怎麼樣的呢?首先需要明白的,就是各項資料的意義。輸出項含義 table 表的名稱。scan count 執行的掃瞄次數。logical reads 從資料快...