亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Mysql中FIND_IN_SET與JOIN在一對多關系查詢時的優劣

Mysql中FIND_IN_SET與JOIN在一對多關系查詢時的優劣

慕森卡 2019-03-29 10:58:19
Mysql中的FIND_IN_SET函數在我知道它之前,我在做一個一對多的外鍵查詢時,都會在中間設計一個關系表。比如一篇文章(post)對應多個標簽(tag),我就會在中間設計一個關系表(post_tag_mapping)來記錄文章和標簽的對應關系,然后查詢某一個標簽下的文章時,就用JOIN語句來實現了,這也應該是處理一對多關系查詢時的標準做法。一般語句就像下面SELECT*FROMpostLEFTJOINpost_tag_mappingWHEREtag_id=123但是當我發現FIND_IN_SET函數后,就可以完全不用JOIN這種查詢方式了,我們完全可以在文章表里設置一個類型為SET的標簽字段(tags),它存儲標簽id的格式就像這樣111,222,333,查詢語句就變成了SELECT*FROMpostWHEREFIND_IN_SET('123',tags)不用做連接查詢了,我不知道這兩者在查詢效率上哪個更占優勢?他們的應用場景有什么需要注意的地方?SET類型能夠做索引嗎,做完以后對FIND_IN_SET有用嗎?
查看完整描述

2 回答

?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

就你的例子來說,用中間(映射)表,可以借助索引提高查詢效率。FIND_IN_SET屬于字符串操作,如果用在字段上,得全表掃描。SET類型的實現是64位的bitmap(對應64個成員),作為FIND_IN_SET的第二個參數,可以用位運算來提高函數的效率(不等于查詢效率)。限制有:成員不能包含“,”字符最多只能有64個成員,而且需要預定義,所以用來做tag不合適即便加索引也是整體的(即64個位對應的組合狀態),而不能針對某一個成員(某一個位)UPDATE操作也是整體的,你需要自己運算新的bitmap所以SET最適合用于值域小,取值固定,整體查詢的狀態集合。比如記錄某人去過中國哪些?。嚎梢灾苯颖容^兩個人是否去過相同的省份,或者直接獲得差別,可以高效地查詢哪些人只去過某省或某些省,但查哪些人去過某省或某些省依然是掃全表。
                            
查看完整回答
反對 回復 2019-03-29
?
慕后森

TA貢獻1802條經驗 獲得超5個贊

語法:
FIND_IN_SET(str,strlist)返回str在strlist(1~N個以逗號分割的字符串)中的位置(1~N)。
selectFIND_IN_SET('dell','apple,thinkpad,dell')ASFIND;
FIND3
str不在strlist中或者strlist為空時返回0
selectFIND_IN_SET('acer','apple,thinkpad,dell')ASFIND
FIND0
selectFIND_IN_SET('acer','')ASFIND
FIND0
存在參數為NULL時返回NULL
selectFIND_IN_SET('acer',NULL)ASFIND
FINDNULL
selectFIND_IN_SET(NULL,'apple,thinkpad,dell')ASFIND
FINDNULL
selectFIND_IN_SET(NULL,NULL)ASFIND
FINDNULL
如果第一個參數為數字類型:
selectFIND_IN_SET('001','003,001,002')ASFIND
FIND2
selectFIND_IN_SET(001,'003,001,002')ASFIND
FIND0
selectFIND_IN_SET(001,'003,1,002')ASFIND
FIND2
                            
查看完整回答
反對 回復 2019-03-29
  • 2 回答
  • 0 關注
  • 2426 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號