Mysql中FIND_IN_SET()和IN區(qū)別簡(jiǎn)析
前段時(shí)間項(xiàng)目中使用到Mysql的FIND_IN_SET函數(shù),感覺(jué)挺好用的。過(guò)一段時(shí)間,老大找到我說(shuō),這個(gè)需要改為IN,哈哈,只能改了,原因會(huì)在下面分析到!
弄個(gè)測(cè)試表來(lái)說(shuō)說(shuō)兩者的區(qū)別,測(cè)試數(shù)據(jù)直接在問(wèn)答區(qū)copy一份,能說(shuō)明問(wèn)題就行,哈哈,如果侵犯您的版權(quán)還請(qǐng)見(jiàn)諒,互聯(lián)網(wǎng)嗎,就需要分享!
測(cè)試代碼: CREATE TABLE `test` ( `id` int(8) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `list` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) INSERT INTO `test` VALUES (1, 'name', 'daodao,xiaohu,xiaoqin'); INSERT INTO `test` VALUES (2, 'name2', 'xiaohu,daodao,xiaoqin'); INSERT INTO `test` VALUES (3, 'name3', 'xiaoqin,daodao,xiaohu'); test1:sql = select * from `test` where 'daodao' IN (`list`); 得到結(jié)果空值. test2:sql = select * from `test` where FIND_IN_SET('daodao',`list`); 得到三條數(shù)據(jù)。
拿上面的實(shí)驗(yàn)數(shù)據(jù)說(shuō)話,test1得到的結(jié)果為空,為什么呢?因?yàn)?,mysql中In是比較等不等,此處‘list'是表中的一個(gè)字段,也就是變量,除非它的值剛好和name的值一樣,否則返回的結(jié)果都為空。拿test1來(lái)說(shuō),也即把‘daodao'改為‘daodao,xiaohu,xiaoqin'才會(huì)匹配到第一條記。
test2返回三條數(shù)據(jù),可能是我們剛好需要的。mysql中FIND_IN_SET函數(shù)用來(lái)比較是不是包含,不管‘list'字段是變量或給定的字符串常量都能很好的工作。MySQL中原型為:FIND_IN_SET(str,strlist)。 假如字符串str 在由N 子鏈組成的字符串列表strlist 中,則返回值的范圍在 1 到 N 之間。
一個(gè)字符串列表就是一個(gè)由一些被‘,'符號(hào)分開(kāi)的子鏈組成的字符串。如果第一個(gè)參數(shù)是一個(gè)常數(shù)字符串,而第二個(gè)是type SET列,則 FIND_IN_SET() 函數(shù)被優(yōu)化,使用比特計(jì)算。 如果str不在strlist 或strlist 為空字符串,則返回值為 0 。如任意一個(gè)參數(shù)為NULL,則返回值為 NULL。這個(gè)函數(shù)在第一個(gè)參數(shù)包含一個(gè)逗號(hào)(‘,')時(shí)將無(wú)法正常運(yùn)行。str也可以是變量,比如表中的一個(gè)字段。
當(dāng)然,這不是我們項(xiàng)目中需要將FIND_IN_SET替換為IN的原因,因?yàn)樵谖覀冺?xiàng)目中兩者都可以實(shí)現(xiàn)功能。只是IN比FIND_IN_SET性能高。我們要查詢(xún)的字段是主鍵,使用IN時(shí)會(huì)使用索引,只會(huì)查詢(xún)表中部分?jǐn)?shù)據(jù)。FIND_IN_SET則會(huì)查詢(xún)表中全部數(shù)據(jù),由于數(shù)據(jù)量比較大,性能肯定不高,所以替換為IN。想看查詢(xún)部分還是全部,可以使用EXPLAIN即解釋功能查看,如果是部分則type為range(范圍),全部則type為ALL(全部),還有個(gè)type是const,常量級(jí)的,呵呵。。。
最佳實(shí)踐:
1、如果待查詢(xún)的條件是常量那就使用IN,是變量則使用FIND_IN_SET,可以使用索引的,貌似,哈哈。
2、如果使用IN和FIND_IN_SET都能滿足條件,則最好使用IN,理由同上,特別是查詢(xún)字段為主鍵時(shí)或有索引時(shí)。
3、如果使用IN不能滿足功能需求,那只能使用FIND_IN_SET了,哈哈,有時(shí)候說(shuō)不定IN中條件加個(gè)%號(hào)也可以解決問(wèn)題,加個(gè)%號(hào)IN就不只是比較是否相等了!
總結(jié)
以上就是本文關(guān)于Mysql中FIND_IN_SET()和IN區(qū)別簡(jiǎn)析的全部?jī)?nèi)容,感興趣的朋友可以參閱:MySQL數(shù)據(jù)庫(kù)表分區(qū)注意事項(xiàng)大全【推薦】、幾個(gè)比較重要的MySQL變量、sql和MySQL的語(yǔ)句執(zhí)行順序分析等,希望對(duì)大家有所幫助。歡迎大家留言交流討論,如有不足之處,小編會(huì)及時(shí)改正補(bǔ)充。
- MySQL的FIND_IN_SET函數(shù)使用方法分享
- Mysql中的find_in_set的使用方法介紹
- mysql通過(guò)find_in_set()函數(shù)實(shí)現(xiàn)where in()順序排序
- MySQL中find_in_set()函數(shù)用法示例詳解
- MySQL之FIND_IN_SET()的用法及說(shuō)明
- Mysql中find_in_set()函數(shù)用法詳解以及使用場(chǎng)景
- mysql查詢(xún)FIND_IN_SET?REGEXP實(shí)踐示例
- MySQL中的FIND_IN_SET函數(shù)的使用場(chǎng)景
- mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)詳解
- Mysql中FIND_IN_SET函數(shù)的使用及問(wèn)題
- MySQL FIND_IN_SET函數(shù)的使用場(chǎng)景
相關(guān)文章
- 在下面的練習(xí)中,將創(chuàng)建一個(gè)應(yīng)用程序,它包含的一個(gè)方法能夠計(jì)算一名顧問(wèn)的收費(fèi)金額——假定該顧問(wèn)每天收取固定的費(fèi)用,將根據(jù)工作了多少天來(lái)收費(fèi)。首先要開(kāi)發(fā)應(yīng)用程序的邏輯,然后利用“生成方法存根向?qū)А眮?lái)寫(xiě)出這個(gè)邏輯使用的方法。接著,我們將在一個(gè)控制臺(tái)應(yīng)用程序中運(yùn)行方法,以獲得對(duì)該程序的最終印象。最后,我們將使用Visual Studio 2005調(diào)試器來(lái)檢查方法調(diào)用。2008-04-04
MySQL與MSSQl使用While語(yǔ)句循環(huán)生成測(cè)試數(shù)據(jù)的代碼
有時(shí)候我們測(cè)試性能的時(shí)候經(jīng)常需要生產(chǎn)大量的測(cè)試數(shù)據(jù),用sql語(yǔ)句直接生成的數(shù)據(jù)更快,需要的朋友可以參考下。2010-12-12MySQL?count(*),count(id),count(1),count(字段)區(qū)別
本文主要介紹了MySQL?count(*),count(id),count(1),count(字段)區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05高效數(shù)據(jù)流轉(zhuǎn):Mycat分庫(kù)分表與GreatSQL實(shí)時(shí)同步
聚焦數(shù)據(jù)庫(kù)擴(kuò)容與實(shí)時(shí)數(shù)據(jù)同步,探索MyCat分庫(kù)分表與GreatSQL的強(qiáng)大結(jié)合!想在大規(guī)模數(shù)據(jù)處理中游刃有余?本指南將帶你輕松掌握MyCat的分布式解決方案和GreatSQL的實(shí)時(shí)同步機(jī)制,讓高效、穩(wěn)定的數(shù)據(jù)庫(kù)管理觸手可及,一起揭開(kāi)高并發(fā)環(huán)境下數(shù)據(jù)庫(kù)優(yōu)化的神秘面紗吧!2024-01-01MySQL中常用查看鎖和事務(wù)的SQL語(yǔ)句詳解
這篇文章主要介紹了MySQL中常用查看鎖和事務(wù)的SQL語(yǔ)句,用于查看鎖和事務(wù)的狀態(tài),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07mysql事務(wù)select for update及數(shù)據(jù)的一致性處理講解
今天小編就為大家分享一篇關(guān)于mysql事務(wù)select for update及數(shù)據(jù)的一致性處理講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03