mysql查找以逗號分隔的值-find_in_set

需求:有一個表字段不少逗號的值,而後查詢時候傳入一些值,匹配全部數據內包含查詢傳入的這些值的數據函數

可能你一開始會想到 SELECT * FROM xujiantao WHERE game LIKE ‘%44′ 或者 ’44%’ ‘%44%’, 那麼結果可能也會包含444的數據,不太準測試

一開始我用的正則匹配的,今天無心中發現了另一個MYSQL函數,廢話很少說了spa

相信不少人也這麼存過,假若有如下表數據:索引

20141013224532_88392.jpg

而後試下LIKE:class

20141013225606_80496.jpg

它把包含44和包含444的結果都輸出了,而我只想獲得44效率

固然你可使用正則這麼玩:隨機數

SELECT * FROM xujiantao WHERE game REGEXP ‘[\d]?,44,’;im

20141013231159_60883.jpg

比較簡潔一點的,也就是最後要說的用法是FIND_IN_SET函數:數據

SELECT * FROM xujiantao WHERE FIND_IN_SET(44, game);查詢

20141013231654_68377.jpg

一樣沒有把444和888的數據輸出,最終獲得了想要的數據

須要注意的是假如你用的是0X, 00X, 000X這樣的數據查找須要加引號,不然找不到

20141013231939_43640.jpg

OK,我加了一百多萬的隨機數據,簡單對比一下以上幾種查詢方式的效率

20141014000257_14131.jpg

使用LIKE查詢包含2二、27三、239九、7390的結果,主要看下耗時

20141014002534_26809.jpg

1.29秒

使用正則查詢包含2二、27三、239九、7390的結果

20141014002712_63069.jpg

使用FIND_IN_SET查詢包含2二、27三、239九、7390的結果

20141014002811_35491.jpg

以上截圖都是用的InnoDB引擎,game字段加了索引

後來改爲MyIsam引擎又測試了下多個不一樣條件查詢,慢了差很少8%的速度

最後要說的就是FIND_IN_SET函數比LIKE和正則匹配快一些

正則寫起來費勁,還要保證正確性,就算獲得精確結果應該也不會太快

FIND_IN_SET比較快一些,OR 4個條件 的結果 LIMIT 20 也才 0.1秒,加個倒序0.4秒

MyIsam引擎:

20141015002256_58153.jpg

InnoDB引擎:
20141015002327_92168.jpg

相關文章
相關標籤/搜索