天天看點

巧用覆寫索引提升like查詢效率

作者:時光眼影

大家都知道最左字首比對原則,是以在使用模糊查詢的過程中,會盡量避免使用右比對和左右比對,對于右比對的場景,可以采用将需要模糊查詢的字段,截取後面固定長度的字元串單獨字段儲存,并建立索引的方式來優化詢效率,例如訂單号,可以截取6到9位儲存在short_order_no字段中,既能滿足模糊查詢要求,又友善業務操作。但在某些業務場景中,我們又不可避免會用到左右比對查詢,像商品名稱、優惠券名稱等,這種情況下直接用like '%xx%'是走不了索引的。

巧用覆寫索引提升like查詢效率

以表tbl_coupons2為例,id字段為主鍵,我們先在coupons_name字段建個索引,看下coupons_name like '%test%'的查詢計劃和執行時間:

巧用覆寫索引提升like查詢效率
巧用覆寫索引提升like查詢效率

可以看到,查詢走的是全表掃描。接下來我們改下查詢語句的寫法,看下查詢計劃和執行時間:

巧用覆寫索引提升like查詢效率
巧用覆寫索引提升like查詢效率

可以看到查詢分别走了主鍵索引和coupons_name字段索引,查詢效率有明顯提升。

什麼是覆寫索引

  • 解釋一:就是select的資料列隻用從索引中就能夠取得,不必從資料表中讀取,換句話說查詢列要被所使用的索引覆寫。
  • 解釋二:索引是高效找到行的一個方法,當能通過檢索索引就可以讀取想要的資料,那就不需要再到資料表中讀取行了。如果一個索引包含了(或覆寫了)滿足查詢語句中字段與條件的資料就叫做覆寫索引。
  • 解釋三:是非聚集組合索引的一種形式,它包括在查詢裡的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆寫查詢語句[select子句]與查詢條件[Where子句]中所涉及的字段,也即,索引包含了查詢正在查找的所有資料)。
  • 覆寫索引可以直接通過周遊索引取得資料,而無需回表,這減少了很多的随機io操作,進而提升了查詢性能。

利用覆寫索引優化查詢步驟

第一步:為要使用like '%xx'或like '%xx%'的列建立單獨索引;

第二步:以該列為like查詢條件查詢主鍵列(與該列),并将該子查詢作為一張結果表;

第三步:将結果表與原表用主鍵列建立内連接配接;

第四步:其它查詢限制條件使用原表字段進行限制。

繼續閱讀