需求:有一個表字段很多逗號的值,然后查詢時候傳入一些值,匹配所有數據內包含查詢傳入的這些值的數據
可能你一開始會想到 SELECT * FROM xujiantao WHERE game LIKE ‘%44′ 或者 ’44%’ ‘%44%’, 那么結果可能也會包含444的數據,不太准
一開始我用的正則匹配的,今天無意中發現了另外一個MYSQL函數,廢話不多說了
相信很多人也這么存過,假如有以下表數據:
然后試下LIKE:
它把包含44和包含444的結果都輸出了,而我只想得到44
當然你可以使用正則這么玩:
SELECT * FROM xujiantao WHERE game REGEXP ‘[\d]?,44,’;
比較簡潔一點的,也就是最后要說的用法是FIND_IN_SET函數:
SELECT * FROM xujiantao WHERE FIND_IN_SET(44, game);
同樣沒有把444和888的數據輸出,最終得到了想要的數據
需要注意的是假如你用的是0X, 00X, 000X這樣的數據查找需要加引號,否則找不到
OK,我加了一百多萬的隨機數據,簡單對比一下以上幾種查詢方式的效率
使用LIKE查詢包含22、273、2399、7390的結果,主要看下耗時
1.29秒
使用正則查詢包含22、273、2399、7390的結果
使用FIND_IN_SET查詢包含22、273、2399、7390的結果
以上截圖都是用的InnoDB引擎,game字段加了索引
后來改成MyIsam引擎又測試了下多個不同條件查詢,慢了差不多8%的速度
最后要說的就是FIND_IN_SET函數比LIKE和正則匹配快一些
正則寫起來費勁,還要保證正確性,就算得到精確結果應該也不會太快
FIND_IN_SET比較快一些,OR 4個條件 的結果 LIMIT 20 也才 0.1秒,加個倒序0.4秒
MyIsam引擎:
InnoDB引擎: