like關鍵字我們也是經常使用,用來模糊查詢使用者名,那麼like如何進行優化呢?這篇部落格就簡單讨論一下like的優化,但是真實的生産環境要比這複雜多了。
1.%号不放最左邊
先建立表和索引。
然後進行查詢【explain select * from tb where name like 'e%';】
可以看到我們的查詢使用上了idx_name這個索引,因為我們的 'e%' 規定了隻要以字元 'e' 開頭的name,是以MySQL使用上了我們建立的索引。
把sql修改一下在進行查詢【explain select * from tb where name like 'e%y_t';】
同樣使用上了建立的索引。
再來修改一下【explain select * from tb where name like '%e%';】
可以看到這個時候就無法使用索引了,開頭是不确定的,MySQL也無法進行優化了,隻能掃描表了。
2.使用覆寫索引
如果業務需要%就放開頭我們也沒辦法,一般情況需求都是這樣的,畢竟優化還是為業務服務的。
這個時候可以考慮使用覆寫索引(關于覆寫索引:MySQL系列-優化之覆寫索引),假設業務需要通過name來擷取使用者的age的話,我們可以對name、age字段建立複合索引。
建立複合索引idx_name_age:
執行sql【explain select name,age from tb where name like '%e%';】
可以看到,查詢是覆寫索引的,起碼比全表掃描要好。
如果需要更多字段的資料而不單單是age的話,可以進行兩次查詢,第一次通過name來擷取id(這一步是索引掃描),第二步拿擷取來的資料在進行id比對查詢(這一步效率很高,ref或者const)。
---------------------
來源:https://blog.csdn.net/ufo___/article/details/81164996