一般SQL中模糊查詢使用like,今天看到一個MySQL使用instr函數模糊查詢的方法:
查詢table表中用戶名包含Cyrec的記錄:
SELECT * FROM table WHERE 1 = instr(`username`,'Cyrec');
等價於SELECT * FROM table WHERE `username` like '%Cyrec%';
(PS:instr這個MySQL函數返回username字段中包含Cyrec的位置,如果沒找到返回0;)
使用like類似‘%xxx%’ 雙向模糊匹配是無法使用索引的,要進行全表掃描('xxx%'這樣滿足最左前綴匹配可以使用索
引效率很高).網上說有大量記錄的時候instr函數效率比用like('%xxx%')高,於是自己在本地試了下,執行時間差不
多用explain看到兩種方式都是進行全表掃描(type=ALL),預計掃描的rows也一樣,然後在status中看到執行計劃預
測的last_query_cost也是一樣。不知道到底哪個好,以後遇到模糊查詢的時間再試下,不過這條SQL語句的思路
挺好的。