天天看點

mysql find_in_set 和 in 差別_Mysql中FIND_IN_SET()和IN差別簡析

測試SQL:

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(IN):

sql = select * from `test` where 'daodao' IN (`list`); #得到結果空值.

mysql中In是比較等不等,此處‘list'是表中的一個字段,也就是變量,除非它的值剛好和name的值一樣,否則傳回的結果都為空。拿test1來說,也即把‘daodao,xiaohu,xiaoqin' 改為 ‘daodao'才會比對到第一條記錄。

test2 (FIND_IN_SET):

sql = select * from `test` where FIND_IN_SET('daodao',`list`); #得到三條資料。

mysql中FIND_IN_SET函數用來比較是不是包含,不管‘list'字段是變量或給定的字元串常量都能很好的工作。

MySQL中原型為:FIND_IN_SET(str,strlist)。 假如字元串str 在由N 子鍊組成的字元串清單strlist 中,則傳回值的範圍在 1 到 N 之間。

一個字元串清單就是一個由一些被‘,'符号分開的子鍊組成的字元串。如果第一個參數是一個常數字元串,而第二個是type SET列,則   FIND_IN_SET() 函數被優化,使用比特計算。

如果str不在strlist 或strlist 為空字元串,則傳回值為 0 。如任意一個參數為NULL,則傳回值為 NULL。這個函數在第一個參數包含一個逗号(‘,')時将無法正常運作。str也可以是變量,比如表中的一個字段。

-------------

在原創作者的項目中需要将FIND_IN_SET替換為IN的原因,因為在項目中兩者都可以實作功能。隻是IN比FIND_IN_SET性能高。我們要查詢的字段是主鍵,使用IN時會使用索引,隻會查詢表中部分資料。FIND_IN_SET則會查詢表中全部資料,由于資料量比較大,性能肯定不高,是以替換為IN。想看查詢部分還是全部,可以使用EXPLAIN即解釋功能檢視,如果是部分則type為range(範圍),全部則type為ALL(全部),還有個type是const,常量級的

最佳實踐:

1、如果待查詢的條件是常量那就使用IN,是變量則使用FIND_IN_SET,可以使用索引的,貌似,哈哈。

2、如果使用IN和FIND_IN_SET都能滿足條件,則最好使用IN,理由同上,特别是查詢字段為主鍵時或有索引時。

3、如果使用IN不能滿足功能需求,那隻能使用FIND_IN_SET了,哈哈,有時候說不定IN中條件加個%号也可以解決問題,加個%号IN就不隻是比較是否相等了!

總結

以上就是本文關于Mysql中FIND_IN_SET()和IN差別簡析的全部内容,感興趣的朋友可以參閱:MySQL資料庫表分區注意事項大全【推薦】、幾個比較重要的MySQL變量、sql和MySQL的語句執行順序分析等