1、查詢中盡量避免使用SELECT * 以及加上LIMIT限制
當服務(wù)器響應(yīng)客戶端請求時,客戶端必須完整的接收整個返回結(jié)果,而不能簡單的只取前面幾條結(jié)果,然后讓服務(wù)器停止發(fā)送。查詢應(yīng)盡可能只返回必要數(shù)據(jù),減小通信數(shù)據(jù)包大小和數(shù)量,提高效率。
2、IN 和 NOT IN 要慎用,會導致全表掃描。
MySQL優(yōu)化器會選擇代價最小的方式執(zhí)行,IN和NOT IN 都可能索引失效,不是絕對的。
3、LIKE 導致全表掃描
LIKE導致索引失效是因為沒遵循最佳左前綴法則。字符串B-Tree排序方式:先按照第一個字母排序,如果第一個字母相同,就按照第二個字母排序,以此類推。
%號放右邊
由于B-Tree的索引順序,是按照首字母的大小進行排序,前綴匹配又是匹配首字母。所以可以在B+樹上進行有序的查找,查找首字母符合要求的數(shù)據(jù)。所以有些時候可以用到索引。
4、聯(lián)合索引需遵循最佳左前綴法則
GLS_CODE,BARCODE,SKU_ID 創(chuàng)建了聯(lián)合索引,當查詢語句where條件中沒有GLS_CODE列不會走聯(lián)合索引。創(chuàng)建這種多列聯(lián)合索引時,列的順序非常重要。
B-Tree聯(lián)合索引組合順序與創(chuàng)建時列的順序是一樣的,第一個字段列的順序是確定的,其他列的順序都是不確定的。B-Tree索引的限制,如果查詢不是按照索引創(chuàng)建時的順序,則無法使用索引。
在查詢中where條件里存在聯(lián)合索引第一列,順序不一致也是可以走索引的。這里是因為MySQL優(yōu)化器會對查詢重新排序。
5、不要在索引列上做任何操作
索引列存在計算、函數(shù)、類型轉(zhuǎn)換,會導致索引失效進行全表掃描。
6、is null,is not null可能導致索引失效
7、要注意where,order by,group by后面的列,多表關(guān)聯(lián)的列是否已加索引,優(yōu)先考慮組合索引
8、where后面的列要注意隱式轉(zhuǎn)換,會導致索引失效
不加單引號時,是字符串跟數(shù)字的比較,它們類型不匹配,MySQL會做隱式的類型轉(zhuǎn)換,把它們轉(zhuǎn)換為浮點數(shù)再做比較,最后導致索引失效。
(責任編輯:代碼如詩) |