首先在接著**之前,我們先說一下,如何判斷資料庫的索引是否生效!相信大家應該猜到了,就是explain!explain顯示了mysql如何使用索引來處理select語句以及連線表。他可以幫助選擇更好的索引和寫出更優化的查詢語句。
例如我們有一張表user,為name列建立索引name_index,如下所示:
使用explain分析語句如下:
可以看到,使用explain顯示了很多列,各個關鍵字的含義如下:
1、應盡量避免在 where 子句中使用 != 或 <> 操作符,否則引擎將放棄使用索引而進行全表掃瞄;
2、盡量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃瞄,即使其中有條件帶索引也不會使用,這也是為什麼盡量少用 or 的原因;
3、對於多列索引,不是使用的第一部分,則不會使用索引;
4、如果列型別是字串,那一定要在條件中將資料使用引號引用起來,否則不會使用索引;
5、like的模糊查詢以 % 開頭,索引失效;
6、應盡量避免在 where 子句中對字段進行表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄;
7、應盡量避免在 where 子句中對字段進行函式操作,這將導致引擎放棄使用索引而進行全表掃瞄;
8、不要在 where 子句中的 「=」 左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引;
9、如果mysql估計使用全表掃瞄要比使用索引快,則不使用索引;
10、不適合鍵值較少的列(重複資料較多的列)
假如索引列type有5個鍵值,如果有1萬條資料,那麼 where type = 1將訪問表中的2000個資料塊。再加上訪問索引塊,一共要訪問大於200個的資料塊。如果全表掃瞄,假設10條資料乙個資料塊,那麼只需訪問1000個資料塊,既然全表掃瞄訪問的資料塊少一些,肯定就不會利用索引了。
避免索引失效
1.全值匹配,對索引中所有列都指定具體值。2.最左字首法則,如果索引有多列,要遵循最左字首法則。指的是查詢從索引的最左前列開始,並且不跳過索引中的列。否者不走索引。3.範圍查詢右邊的列,不走索引,應為mysql底層範圍查詢之後結構就斷了,就無法使用後面得索引了。4.不要在索引列上進行運算操作,索引將...
如何避免索引失效
全值匹配 最佳左字首法則 如果索引了多列,要遵守最左字首法則。指得時查詢從索引的最左前列開始並且不跳過索引中的列 不在索引列上左任何操作 計算 函式 自動or手動 型別轉換 因為在索引列上做操作會導致索引失效而轉向全表掃瞄 儲存引擎不能使用索引中範圍條件右邊的列 盡量使用覆蓋索引 只訪問索引的查詢 ...
這樣寫sql避免索引失效
合理地對資料表加索引可以大大加快資料的訪問效率,但索引也不是對任何查詢都有效,如果sql的結構不當,也會發生索引失效。所以為避免採坑,寫下此文,作為記錄。下面的例子是在mysql中建立的一張表,建表語句如下 create table user info id bigint 32 not null,n...