如果不斷地刪除歷史數據和新增數據,MySQL有時會選錯索引。
選擇索引是優化器的工作,優化器優化時會考慮的因素:掃描行數、是否需要排序、是否使用臨時表
MySQL通過統計索引上的基數,作為索引的區分度。
統計方法時采樣統計,InnoDB默認選擇N個數據頁,統計這些頁面上的不同值,得到一個平均值
然后乘以這個索引的頁面數,就得到了這個索引的基數。
舉例:
取n = 3個數據頁統計,假設共有10個索引數據頁
page1:10個不同值
page2: 20個不同值
page3: 15個不同值
索引基數:(10+20+15)/3 * 10 = 150;
如果發現explain的結果預計的rows值和實際情況相差較大,可以使用analyze table t命令恢復,重新統計索引信息
當索引選擇出現問題
方法一:采用force index 強行選擇一個索引
select * from t force index(a) where a between 1 and 1000 and b between 5000 and 10000 order by b limit 1;
(如果優化器沒有選擇正確的索引,force index 就對其矯正)
開發的時候不會先寫上force index,等到出現問題時再去修改語句
方法二:修改語句,引導MySQL使用我們期望的索引
方法三:在一些場景下,新建一個更加合適的索引,來提供給優化器做選擇,或者刪除掉誤用的索引