首頁 > 軟體

生產環境MySQL索引時效的排查過程

2022-04-10 22:00:24

 早上收到開發同學求助,有個SQL查詢耗時特別長,看了執行計劃發現沒有走索引,但是不知道原因在哪裡,我們一起來分析一下。

mysql>explain SELECT
	* 
FROM
	artisan_income 
WHERE
	parent_id IN (
		222645481,
		222583953,
		222181775,
		222180931,
		222081126,
		221678753,
		221616102,
		221591783,
		221219312,
		221195482,
		221118672,
		220763129,
		220654289,
		220633930,
		220323633,
		220227641,
		219825564,
		219720338,
		219321345,
	219291958 
	) G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: artisan_income
   partitions: 
         type: ALL
possible_keys: idx_parent_id
          key: 
      key_len: 
          ref: 
         rows: 20711352
     filtered: 100
        Extra: Using where

確實是全表掃描,帶著疑問我們把生產環境資料同步到測試庫,方便測試,然後在測試環境進行查詢。

mysql>explain SELECT
	* 
FROM
	artisan_income 
WHERE
	parent_id IN (
		222645481,
		222583953,
		222181775,
		222180931,
		222081126,
		221678753,
		221616102,
		221591783,
		221219312,
		221195482,
		221118672,
		220763129,
		220654289,
		220633930,
		220323633,
		220227641,
		219825564,
		219720338,
		219321345,
	219291958 
	) G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: artisan_income
   partitions: 
         type: range
possible_keys: idx_parent_id
          key: idx_parent_id
      key_len: 5
          ref: 
         rows: 1870780
     filtered: 100
        Extra: Using index condition

發現在測試環境就用到了parent_id欄位的索引,生產庫和測試庫同樣都是5.7的版本,資料也幾乎一樣,但是執行計劃不一樣,第一時間想到了統計資訊的問題,於是進行analyze table

analyze table artisan_income;

然後檢視執行計劃:

mysql>explain SELECT
	* 
FROM
	artisan_income 
WHERE
	parent_id IN (
		222645481,
		222583953,
		222181775,
		222180931,
		222081126,
		221678753,
		221616102,
		221591783,
		221219312,
		221195482,
		221118672,
		220763129,
		220654289,
		220633930,
		220323633,
		220227641,
		219825564,
		219720338,
		219321345,
	219291958 
	) G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: artisan_income
   partitions: 
         type: range
possible_keys: idx_parent_id
          key: idx_parent_id
      key_len: 5
          ref: 
         rows: 1901880
     filtered: 100
        Extra: Using index condition

發現執行計劃已經恢復正常。

mysql>SELECT
	* 
FROM
	artisan_income 
WHERE
	parent_id IN (
		222645481,
		222583953,
		222181775,
		222180931,
		222081126,
		221678753,
		221616102,
		221591783,
		221219312,
		221195482,
		221118672,
		220763129,
		220654289,
		220633930,
		220323633,
		220227641,
		219825564,
		219720338,
		219321345,
	219291958 
	) G
返回行數:[0],耗時:2 ms.

到此這篇關於生產環境MySQL索引時效的排查過程的文章就介紹到這了,更多相關MySQL索引排查內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com