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