日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 一对多 join_Mysql中FIND_IN_SET与JOIN在一对多关系查询时的优劣

發布時間:2025/3/15 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 一对多 join_Mysql中FIND_IN_SET与JOIN在一对多关系查询时的优劣 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Mysql中的FIND_IN_SET函數在我知道它之前,我在做一個一對多的外鍵查詢時,都會在中間設計一個關系表。比如一篇文章(post)對應多個標簽(tag),我就會在中間設計一個關系表(post_tag_mapping)來記錄文章和標簽的對應關系,然后查詢某一個標簽下的文章時,就用

JOIN

語句來實現了,這也應該是處理一對多關系查詢時的標準做法。一般語句就像下面

SELECT * FROM post LEFT JOIN post_tag_mapping WHERE tag_id = 123

但是當我發現

FIND_IN_SET

函數后,就可以完全不用

JOIN

這種查詢方式了,我們完全可以在文章表里設置一個類型為SET的標簽字段(tags),它存儲標簽id的格式就像這樣

111,222,333

,查詢語句就變成了

SELECT * FROM post WHERE FIND_IN_SET('123', tags)

不用做連接查詢了,我不知道這兩者在查詢效率上哪個更占優勢?他們的應用場景有什么需要注意的地方?

SET

類型能夠做索引嗎,做完以后對

FIND_IN_SET

有用嗎?

就你的例子來說,用中間(映射)表,可以借助索引提高查詢效率。FIND_IN_SET屬于字符串操作,如果用在字段上,得全表掃描。

SET類型的實現是64位的bitmap(對應64個成員),作為FIND_IN_SET的第二個參數,可以用位運算來提高函數的效率(不等于查詢效率)。限制有:

成員不能包含“,”字符

最多只能有64個成員,而且需要預定義,所以用來做tag不合適

即便加索引也是整體的(即64個位對應的組合狀態),而不能針對某一個成員(某一個位)

UPDATE操作也是整體的,你需要自己運算新的bitmap

所以SET最適合用于值域小,取值固定,整體查詢的狀態集合。比如記錄某人去過中國哪些省:可以直接比較兩個人是否去過相同的省份,或者直接獲得差別,可以高效地查詢哪些人只去過某省或某些省,但查哪些人去過某省或某些省依然是掃全表。

總結

以上是生活随笔為你收集整理的mysql 一对多 join_Mysql中FIND_IN_SET与JOIN在一对多关系查询时的优劣的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。