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在一对多关系查询时的优劣相关推荐

  1. 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  2. Django框架(5.django中模型类建立关系和多表关系查询)

    1.建立好模型类: from django.db import models# 设计和模型对应的类,(模型类) # Create your models here.# 一类 # 图书类 class B ...

  3. mysql的natural join_MySQL基础之Natural Join用法

    Natural join即自然连接,natural join等同于inner join或inner using,其作用是将两个表中具有相同名称的列进行匹配 用https://www.w3resourc ...

  4. mysql 多 inner join_mySQL多个INNER JOIN

    我们有三个表要查询,以查找每个企业的客户数和每个企业的记录数 这三个表是: businessDetails ------------------- businessDetails.ID busines ...

  5. oracle触发器修改同一张表,oracle触发器中对同一张表进行更新再查询时,需加自制事务...

    CREATE OR REPLACE TRIGGER Trg_ReimFact BEFORE UPDATE ON BP_Order FOR EACH ROW DECLARE PRAGMA AUTONOM ...

  6. mysql用于删除表中数据的关键字是_MySQL-删除数据(DELECT)

    数据库备份介绍: 数据库一旦删除数据,它就会永远消失. 因此,在执行DELETE语句之前,应该先备份数据库,以防万一要找回删除过的数据. MySQL提供了非常有用的工具,用于在服务器上本地备份或转储M ...

  7. mysql两个表left join_mysql中两张表使用left join on 求差集

    1.表结构 mysql> select * from allStudents; +----+-------+ | id | name | +----+-------+ | 1 | ???? | ...

  8. Mysql中find_in_set()函数与in()函数的用法

    背景 今天同事让帮忙写个sql,大致是一张表的两个字段都关联另外一张表的主键,这个完全可以把两个表当作三个表来写,大概是这种: SELECT t1.name, t1.id, t2.reason, t3 ...

  9. mysql loop嵌套_MySQL中Nested-Loop Join算法小结

    数据库中JOIN操作的实现主要有三种:嵌套循环连接(Nested Loop Join),归并连接(Merge Join)和散列连接或者哈稀连接(Hash Join).其中嵌套循环连接又视情况又有两种变 ...

最新文章

  1. linux内核模块编译
  2. python xlwt写入数据超过范围限制_python的xlwt不能正确写入以及缓冲区问题
  3. 打造“神犇”是教育的未来吗?
  4. 螺旋测微器 flash_使用测微计收集应用程序指标
  5. 6个实例详解如何把if-else代码重构成高质量代码
  6. 学习php技巧,对初学者非常有用的PHP技巧
  7. vlan间路由的问题
  8. 这样查看告警邮件要慢一点……
  9. 风控建模:催收评分卡(四)--变量整理除了跟数据获取相关外还跟什么有关系?
  10. 洛谷P2881 [USACO07MAR]排名的牛Ranking the Cows(bitset Floyd)
  11. 索引利弊,如何创建索引,单键索引还是组合索引
  12. 计算机无法上网修复工具,网络异常修复工具,连接后无法上网修复方式
  13. 15. Magento路由分发过程解析(四):请求重写
  14. 每日一记—Android动态申请多个权限
  15. ADNI影像数据解析及下载
  16. android热成像模块,Thermal Camera
  17. java基础总结(七十)--Java8中的parallelStream的坑
  18. iP138版 iP地址 离线iP数据库 ip.dat详解
  19. 关于低功耗车牌识别摄像机,你知道多少
  20. Python 变量作用域问题 函数名.变量名

热门文章

  1. 音频电平vu显示表软件下载_音频控制软件-SoundSource 4 Mac
  2. 微软亚洲研究院资深专家、IEEE Fellow帮助您深入细致地学习网络传播模型和算法啦!...
  3. 专题:生物医疗大数据
  4. 作者:郭琨(1985-),女,博士,中国科学院虚拟经济与数据科学研究中心助理研究员...
  5. 【Java】辨析JUnit4中的@AfterClass、@BeforeClass、@after、@before
  6. Jackson将json字符串转换成泛型List
  7. 用perl语言求1到100之间的偶数,奇数及素数
  8. 重新创建Activity
  9. 经典排序算法-MFC实现之2:问题
  10. xp sp3 安装不了ie8