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