MySQL學習之索引順序
阿新 • • 發佈:2018-01-12
like com 查找 技術分享 順序 會有 lec 一次 學習
做為一個PHP開發者,關於MySQL的索引是必不可少的一個問題
比如一條SQL查詢:
select * from userstatic where nick like "辛巴%" and rip=3726854906;
可能問到的問題有:
1、如果nick不是索引,rip是索引,這樣的條件順序會不會有問題?
這個問題比較簡單,MySQL本身會對條件和索引進行判斷,這樣寫可以用到索引,沒有問題。
2、如果nick和rip都是索引,這樣寫有沒有問題?
我們都知道,一次查詢只能使用一個索引,到底怎麽使用索引呢?
網上很多的答案告訴我們,如果兩個字段都建立了索引,會首先匹配左邊的字段,即nick,那麽答案就明顯了,估計nick和rip可能影響的行數,哪個字段影響的行數少,即區分度大就寫在左邊。
到底是不是這樣呢?首先我們把nick和rip都設為索引, 用explain來看一下:
在key列,我們可以看到用到nick做為索引,看上去沒有什麽問題,換個順序試試:
還是用nick做為索引,和我們想的不太一樣。
到底為什麽呢,我試著分析一下,首先我們看這兩個字段單獨做為條件時結果有多少行:
nick可能影響的行數為7行(rows列不是一個精確值)
rip可能影響的行數為181行,那會不會和這個有關系呢?我們換一個值來看一下:
這次rip可能影響1行,比nick可能影響的行數少,再來看一下兩個條件都用到的時候:
這次用到的索引是rip。
那麽我們是不是可以得出結論:書寫SQL語句的時候,我們不用在意條件的前後順序,MySQL在查找的時候會進行優化。
MySQL學習之索引順序