《MySQL——选错索引,该如何做》
如果不斷地刪除歷史數(shù)據(jù)和新增數(shù)據(jù),MySQL有時(shí)會(huì)選錯(cuò)索引。
選擇索引是優(yōu)化器的工作,優(yōu)化器優(yōu)化時(shí)會(huì)考慮的因素:掃描行數(shù)、是否需要排序、是否使用臨時(shí)表
MySQL通過(guò)統(tǒng)計(jì)索引上的基數(shù),作為索引的區(qū)分度。
統(tǒng)計(jì)方法時(shí)采樣統(tǒng)計(jì),InnoDB默認(rèn)選擇N個(gè)數(shù)據(jù)頁(yè),統(tǒng)計(jì)這些頁(yè)面上的不同值,得到一個(gè)平均值
然后乘以這個(gè)索引的頁(yè)面數(shù),就得到了這個(gè)索引的基數(shù)。
舉例:
取n = 3個(gè)數(shù)據(jù)頁(yè)統(tǒng)計(jì),假設(shè)共有10個(gè)索引數(shù)據(jù)頁(yè)
page1:10個(gè)不同值
page2: 20個(gè)不同值
page3: 15個(gè)不同值
索引基數(shù):(10+20+15)/3 * 10 = 150;
如果發(fā)現(xiàn)explain的結(jié)果預(yù)計(jì)的rows值和實(shí)際情況相差較大,可以使用analyze table t命令恢復(fù),重新統(tǒng)計(jì)索引信息
當(dāng)索引選擇出現(xiàn)問(wèn)題
方法一:采用force index 強(qiáng)行選擇一個(gè)索引
select * from t force index(a) where a between 1 and 1000 and b between 5000 and 10000 order by b limit 1;
(如果優(yōu)化器沒(méi)有選擇正確的索引,force index 就對(duì)其矯正)
開(kāi)發(fā)的時(shí)候不會(huì)先寫上force index,等到出現(xiàn)問(wèn)題時(shí)再去修改語(yǔ)句
方法二:修改語(yǔ)句,引導(dǎo)MySQL使用我們期望的索引
方法三:在一些場(chǎng)景下,新建一個(gè)更加合適的索引,來(lái)提供給優(yōu)化器做選擇,或者刪除掉誤用的索引
總結(jié)
以上是生活随笔為你收集整理的《MySQL——选错索引,该如何做》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 24k多少钱一克啊?
- 下一篇: 隔音板多少钱一平米啊?