索引的最左前綴原則


索引的最左前綴原則

原理
  • mysql建立多列索引(聯合索引)有最左前綴的原則,即最左優先,如:
    • 如果有一個2列的索引(col1,col2),則已經對(col1)、(col1,col2)上建立了索引;
    • 如果有一個3列索引(col1,col2,col3),則已經對(col1)、(col1,col2)、(col1,col2,col3)上建立了索引;
范圍查詢
  • 范圍列可以用到索引(必須是最左前綴),但是范圍列后面的列無法用到索引。同時,索引最多用於一個范圍列,因此如果查詢條件中有兩個范圍列則無法全用到索引。
  • mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。
  • 如where a>10 order by b ,索引a_b 無法排序
  • =和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式
查詢條件中含有函數或表達式
  • 如果查詢條件中含有函數或表達式,則MySQL不會為這列使用索引(雖然某些在數學意義上可以使用)
  • 因此在寫查詢語句時盡量避免表達式出現在查詢中,而是先手工私下代數運算,轉換為無表達式的查詢語句
什么時候索引會失效
  • 如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什么盡量少用or的原因)。注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引
  • 對於多列索引,不是使用的第一部分,則不會使用索引(即不符合最左前綴原則)
  • like查詢是以%開頭
  • 如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引
  • 如果mysql估計使用全表掃描要比使用索引快,則不使用索引


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM