最佳左字首法則
所謂的最佳左字首法則就是查詢時使用到的字段順序需要滿足建立索引時的字段順序。
看下面的栗子:
在staffs表上,建立(name,age.pos)的索引
可以看到在index表上,name,age,pos的seq_in_indexx是按照建立索引時的順序從小到大的,即name>age>pos。記住這個順序,現在繼續往下看。
先進行全值匹配
explain
select
*from staffs
where name=
'z3'
and age =
21and pos=
'manager'
;//順序是name->age->pos
explain:
type為ref,key為我們先前建立的索引idx_nap,ref為三個const引用。上面的查詢語句成功的利用了我們建立的索引。現在繼續往下看
依然是全值匹配,但是不按照索引建立時字段的順序進行查詢
explain
select
*from staffs
where age =
21and name=
'z3'
and pos=
'manager'
;//順序是age->name->pos
explain:
explain資訊和前面的按照索引字段順序查詢的全值匹配是一樣的。我們先得出乙個結論全值匹配無需理會左字首法則,只要是全值匹配就能夠成功使用索引我們繼續往下看
不繼續全值匹配了,從索引欄位中抽出兩個進行測試
explain
select
*from staffs
where name=
'z3'
and pos=
'manager'
;//順序是name->pos
explain:
我們發現idx_nap仍然有被使用,但是key_len長度為74,同時ref只有乙個const。我們發現只有第乙個name欄位使用了索引,而pos欄位沒有使用索引。我們得出另乙個結論左字首法則就像是爬樓梯,查詢時字段的順序一定要按照建立索引時字段的順序(全值匹配除外),將name欄位比作1樓,age欄位比作2樓,pos欄位比作3樓。樓梯只能一樓一樓上,如果上了一樓之後再上3樓,不經過2樓,就只能使用到1樓的索引
我們再繼續看下
explain
select
*from staffs
where age =21;
//只使用了age欄位
explain:
根據我們前面的比喻,age為2樓。我們在上述查詢中直接使用了age而避開了name,這就相當於繞過1樓爬2樓,所以此時也沒有利用到索引。
盡量使用覆蓋索引
explain
select
*from staffs //使用select*
where age =
21and name=
'z3'
and pos=
'manager'
;
explain
select name,age,pos from staffs //覆合索引
where age =
21and name=
'z3'
and pos=
'manager'
;
兩個explain相比較,我們發現使用覆合索引時,後者的extra多了using index
覆合索引有什麼好處
mysql可以利用索引返回select列表中的字段,而不必根據索引再次讀取資料檔案。如果select列表中的字段都包含在索引內,成為覆蓋索引,這樣就不再需要回表操作。索引條目遠小於資料行的大小,如果只需要讀取索引,那麼mysql就會極大地減少資料訪問量。
深入MySQL優化 索引優化
查詢category id為1且comments大於1的情況下,views最多的article id explain select id,author id from article where category id 1and comments 1order by views limit 1 ex...
Mysql 之索引優化及索引失效
1.最佳左字首法則 如果索引了多列,要遵守最左字首法則.指的是查詢從索引的最左前列開始並且不跳過索引中的列.2.不在索引上左任何操作 計算,函式,自動or手動 型別轉換 會導致索引失效而轉向全表掃瞄 3.儲存引擎不能使用索引中範圍條件右邊的列 4.盡量使用覆蓋索引 只訪問索引的查詢 索引列和查詢列一...
mysql索引失效 常見mysql索引失效條件
使用索引的一般語句 1 where條件中有or,除非or的所有欄位都有索引,只要有乙個沒有索引,就不走索引 explain select from jf user ju where ju.user id or ju.superior1 yyy user id是主鍵,superior1是普通索引,結果...