2 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個贊
就你的例子來說,用中間(映射)表,可以借助索引提高查詢效率。FIND_IN_SET屬于字符串操作,如果用在字段上,得全表掃描。
SET類型的實(shí)現(xiàn)是64位的bitmap(對應(yīng)64個成員),作為FIND_IN_SET的第二個參數(shù),可以用位運(yùn)算來提高函數(shù)的效率(不等于查詢效率)。限制有:
成員不能包含“,”字符
最多只能有64個成員,而且需要預(yù)定義,所以用來做tag不合適
即便加索引也是整體的(即64個位對應(yīng)的組合狀態(tài)),而不能針對某一個成員(某一個位)
UPDATE操作也是整體的,你需要自己運(yùn)算新的bitmap
所以SET最適合用于值域小,取值固定,整體查詢的狀態(tài)集合。比如記錄某人去過中國哪些省:可以直接比較兩個人是否去過相同的省份,或者直接獲得差別,可以高效地查詢哪些人只去過某省或某些省,但查哪些人去過某省或某些省依然是掃全表。

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個贊
語法:
FIND_IN_SET(str,strlist)
返回str在strlist(1~N個以逗號分割的字符串)中的位置(1~N)。
select FIND_IN_SET('dell','apple,thinkpad,dell') AS FIND;
FIND
3
str不在strlist中或者strlist為空時返回0
select FIND_IN_SET('acer','apple,thinkpad,dell') AS FIND
FIND
0
select FIND_IN_SET('acer','') AS FIND
FIND
0
存在參數(shù)為 NULL 時返回 NULL
select FIND_IN_SET('acer',NULL) AS FIND
FIND
NULL
select FIND_IN_SET(NULL,'apple,thinkpad,dell') AS FIND
FIND
NULL
select FIND_IN_SET(NULL,NULL) AS FIND
FIND
NULL
如果第一個參數(shù)為數(shù)字類型:
select FIND_IN_SET('001','003,001,002') AS FIND
FIND
2
select FIND_IN_SET(001,'003,001,002') AS FIND
FIND
0
select FIND_IN_SET(001,'003,1,002') AS FIND
FIND
2
添加回答
舉報