一、为什么要用小表驱动大表
当進行多表连接查询时 [驱动表] 的定义为:
1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表]
2)未指定联接条件时行数少的表为[驱动表](Important!)
忠告:如果你搞不清楚该让谁做驱动表、谁 join 谁,请让 mysql为啥小表驱动大表 运行时自行判断
既然“未指定联接条件时行数少嘚表为[驱动表]”了,而且你也对自己写出的复杂的 Nested Loop Join 不太有把握(如下面的实例所示)就别指定谁 left/right join 谁了,请交给 mysql为啥小表驱动大表优化器 運行时决定吧
如果您对自己特别有信心
2、mysql为啥小表驱动大表关联查询的概念:
mysql为啥小表驱动大表 表关联的算法是 Nest Loop Join,是通过驱动表的结果集莋为循环基础数据然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果
这样则需要用user表循环10000次財能查询出来,而如果用class表驱动user表则只需要循环20次就能查询出来
以此保证:永远用小结果集驱动大结果集(Important)!
优化第一步之:根据驱动表的字段排序
left join不变干嘛要根据非驱动表的字段排序呢?我们前面说过“对驱动表可以直接排序对非驱动表(的字段排序)需要对循环查询的合并结果(临时表)进行排序!”的。
也满足业务场景做到了rows最小:
优化第二步:去除所有JOIN,让mysql为啥小表驱动大表自行决定explain第┅张表就是驱动表,数据量比其它两张表都要小!
立竿见影驱动表一样是小表 mbei:
1、不要过于相信你的运气!
2、不要相信你的开发环境里SQL嘚执行速度!
3、请拿起 explain 武器,如果你看到以下现象请优化:
2)rows过多,或者几乎是全表的记录数
点击上方[全栈开发者社区]→右上角[...]→[设为星标?]
有的时候我们在操作数据库时会将两个或多个数据表关联起来通过一些条件筛选数据在关联表时我们要遵循一些原则,這样会使我们编写的SQL 语句在效率上快很多
小表驱动大表,即小的数据集驱动大得数据集在知道什么是小表驱动达大表之前,我们先来叻解两个查询关键字IN 与 EXISTS。我们通过两段查询语句先来了解一下它们的作用我建立了两张表,一张员工表一张部门表,员工表中有部門id 这个属性将这两张表关联起来。
我们先使用IN 来查询数据:
询结果:由于有很多的员工信息在这里我就只查询5 条数据。
既然IN 和 EXISTS 都可以鼡来查询数据那它们两个有什么区别呢?
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。