1,操作符和index關係
<>,!=,not in 不會使用index
<,<=,=,>,>=,between,in 可以使用索引
like 看情況,遵循最左原則就會用.
like ‘%xxx%’不會用.
like ‘xxx%’ 會用
or 看情況
所有的or條件都必須是獨立索引,這樣纔會使用索引.
可以用in或者union來替換or.
where後面field不一樣的判斷用union,一樣的判斷用or.
2,數據類型和index關係
類型一定要匹配,否則使用不了index.
select * from test where mobile = 13711112222;
如果mobile是char或者varchar類型,那麼上面即使mobile字段設置了索引,也不會使用,注意類型匹配.要添加”: select * from test where mobile = ‘13711112222’;
3,索引列字段進行了函數操作,索引不會使用
如 where md5(password) = “xxxx”,所以不要在索引列上進行運算.
4,NULL會導致索引不可用,可以通過其他方式來表達,比如-1.
5,學會使用短索引,即建立“前綴索引”
對串列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字符內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作。
6,當mysql一旦估計檢查的行數可能會“太多”,範圍查找優化將不會被使用,索引無效
select uid from users where registered < 1295001384;應避免這樣的大數據查詢
7.儘量借用覆蓋索引,減少select * from..語句使用
select uid,fuid from users where uid = 1223232; 把index的field正好按index順序輸出.index(uid,fuid)
8.order by子句,儘量使用index方式排序,避免使用filesort方式排序
MySQL支持二種方式的排序,FileSort和Index,後者效率高,它指MySQL掃描索引本身完成排序。FileSort方式效率較低。
ORDER BY滿足以下情況,會使用Index方式排序:
a)ORDER BY 語句使用索引最左前列。
b)使用Where子句與Order BY子句條件列組合滿足索引最左前列.
9.強制使用索引和禁止使用索引
1)強制使用索引: force index(index_name)
select * from table force index(PRI) limit 2;(強制使用主鍵)
select * from table force index(ziduan1_index) limit 2;(強制使用索引”ziduan1_index”)
select * from table force index(PRI,ziduan1_index) limit 2;(強制使用索引”PRI和ziduan1_index”)
2)禁止使用索引:ignore index(index_name)
select * from table ignore index(PRI) limit 2;(禁止使用主鍵)
select * from table ignore index(ziduan1_index) limit 2;(禁止使用索引”ziduan1_index”)
select * from table ignore index(PRI,ziduan1_index) limit 2;(禁止使用索引”PRI,ziduan1_index”)
10.mysql索引選擇,和IO操作數量有關
索引選擇性就是結果個數與總個數的比值。
用sql語句表示爲:
SELECT COUNT() FROM table_name WHERE column_name/SELECT COUNT() FROM table_name
一般來說(例如書 “SQL Tuning“),如果選擇性超過 20% 那麼全表掃描比使用索引性能更優(oracle)。
但MySQL是沒有計算索引的選擇性的,只是預測邏輯IO操作的數量,因此對於MySQL索引要慎重選擇。
參考鏈接:
http://database.51cto.com/art/201104/253568.htm
http://www.cnblogs.com/fanqi/p/6188093.html