有時候我們使用模糊查詢(like)的時候,會出現索引失效的情況,比如根據手機號碼後四位模糊匹配查詢。
在mysql中模糊查詢:mobile like 『%8765』,這種情況是不能使用 mobile 上的索引的,那麼如果需要根據手機號碼後四位進行模糊查詢,可以用一下方法進行改造。
我們可以加入冗餘列(mysql5.7之後加入了虛擬列,使用虛擬列更合適,思路相同),比如 mobile_reverse,內部儲存為 mobile 的倒敘文字,如 mobile 17312345678(手機號碼為虛構),那麼 mobile_reverse 儲存 87654321371,為 mobile_reverse 列建立索引,查詢中使用語句 mobile_reverse like reverse(』%5678』) 即可。
reverse 是 mysql 中的反轉函式,這條語句相當於mobile_reverse like 『8765%』 ,這種語句是可以使用索引的。
mobile_reverse 的更新可以用觸發器解決,為表新建 』新增『和』更新『的觸發器,寫入以下文字即可。
set new.mobile_reverse = reverse(new.mobile)
;
未改造前模糊查詢語句為:
select
*from *** where mobile like
'%5678'
;
改造後查詢語句為:
select
*from *** where mobile_reverse like reverse(
'%5678'
);
或者
select
*from *** where mobile_reverse like
'8765%'
;
改造後的模糊匹配可以使用 mobile_reverse 欄位上的索引,加快查詢速度。 避免索引失效
1.全值匹配,對索引中所有列都指定具體值。2.最左字首法則,如果索引有多列,要遵循最左字首法則。指的是查詢從索引的最左前列開始,並且不跳過索引中的列。否者不走索引。3.範圍查詢右邊的列,不走索引,應為mysql底層範圍查詢之後結構就斷了,就無法使用後面得索引了。4.不要在索引列上進行運算操作,索引將...
怎麼避免索引失效
首先在接著 之前,我們先說一下,如何判斷資料庫的索引是否生效!相信大家應該猜到了,就是explain!explain顯示了mysql如何使用索引來處理select語句以及連線表。他可以幫助選擇更好的索引和寫出更優化的查詢語句。例如我們有一張表user,為name列建立索引name index,如下所...
如何避免索引失效
全值匹配 最佳左字首法則 如果索引了多列,要遵守最左字首法則。指得時查詢從索引的最左前列開始並且不跳過索引中的列 不在索引列上左任何操作 計算 函式 自動or手動 型別轉換 因為在索引列上做操作會導致索引失效而轉向全表掃瞄 儲存引擎不能使用索引中範圍條件右邊的列 盡量使用覆蓋索引 只訪問索引的查詢 ...