怎麼看sql語句有沒有走索引(sql索引失效有哪些情況會失效)
MySQL中建立索引的原則,有以下幾點:
1、表的主鍵、外來鍵必須有索引;
2、經常與其他表進行連線的表,在連線欄位上應該建立索引;
3、選擇唯一性索引;
唯一性索引unique index和一般索引normal index最大的差異就是在索引列上增加了一層唯一約束。
4、對於查詢頻率高的欄位建立索引;
5、對排序、分組、聯合查詢頻率高的欄位建立索引;
6、儘量使用字首來索引;
字首索引是MySQL中的一個概念,在SQL Server和Oracle中沒提出這個概念。字首索引就是對文字的前幾個字元(具體是幾個字元在建立索引時指定)建立索引,這樣建立起來的索引更小,所以查詢更快。字首索引能有效減小索引檔案的大小,提高索引的速度,但是字首索引也有它的壞處:MySQL 不能在 ORDER BY 或 GROUP BY 中使用字首索引,也不能把它們用作覆蓋索引(Covering Index)。
7、索引應該建在選擇性高的欄位上,在選擇性低的欄位上不必要建立索引,如:性別欄位;
8、索引應該建在小欄位上,對於大的文字欄位甚至超長欄位,不要建索引;
9、索引列不能參與計算,保持列“乾淨”;
10、對於定義為 text、image 和 bit 的資料型別的列不要建立索引;
11、若在實際中,需要將多個列設定索引時,可以採用多列索引;
12、一個表的索引的數目不宜太多;
13、刪除不再使用或者很少使用的索引,避免對執行計劃造成負面影響;
MySQL什麼時候不走索引?主要3種情況:
1、不滿足走索引的條件,常見的情況有
1.1、不滿足最左匹配原則(索引的底層是一顆B 樹,最左優先,以最左邊的為起點任何連續的索引都能匹配上,同時遇到範圍查詢(>、<、between、like)就會停止匹配。);
1.2、查詢條件使用了函式;
1.3、or 操作有一個欄位沒有索引(必須所有的or條件都必須是獨立索引才能用到索引);
1.4、使用 like條件以%開頭;
2、走索引效率低於全表掃描,常見的情況有
2.1、查詢條件對 null 做判斷,而 null 的值很多;
2.2、一個欄位區分度很小,比如:性別、狀態;
3、需要回表的查詢結果集過大,超過了配置的範圍