了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表
来源:互联网 发布:淘宝店铺如何入手 编辑:程序博客网 时间:2024/06/10 04:57
一、为什么要用小表驱动大表
1、驱动表的定义
当进行多表连接查询时, [驱动表] 的定义为:
1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表]
2)未指定联接条件时,行数少的表为[驱动表](Important!)
忠告:如果你搞不清楚该让谁做驱动表、谁 join 谁,请让 MySQL 运行时自行判断
既然“未指定联接条件时,行数少的表为[驱动表]”了,而且你也对自己写出的复杂的 Nested Loop Join 不太有把握(如下面的实例所示),就别指定谁 left/right join 谁了,请交给 MySQL优化器 运行时决定吧。
如果您对自己特别有信心
2、mysql关联查询的概念:
MySQL 表关联的算法是 Nest Loop Join,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。
例: user表10000条数据,class表20条数据
select * from user u left join class c u.userid=c.userid
这样则需要用user表循环10000次才能查询出来,而如果用class表驱动user表则只需要循环20次就能查询出来
例:
select * from class c left join user u c.userid=u.userid
小结果集驱动大结果集
de.cel 在2012年总结说,不管是你,还是 MySQL,优化的目标是尽可能减少JOIN中Nested Loop的循环次数。
以此保证:永远用小结果集驱动大结果集(Important)!
二、优化联表查询
优化第一步之:根据驱动表的字段排序
left join不变,干嘛要根据非驱动表的字段排序呢?我们前面说过“对驱动表可以直接排序,对非驱动表(的字段排序)需要对循环查询的合并结果(临时表)进行排序!”的。
explain
SELECT mb.id……
FROM mb LEFT JOIN mbei ON mb.id=mbei.mb_id INNER JOINu ON mb.uid=u.uid
WHERE 1=1
ORDER BY mb.id DESC
limit 0,10
也满足业务场景,做到了rows最小:
优化第二步:去除所有JOIN,让MySQL自行决定,explain第一张表就是驱动表,数据量比其它两张表都要小!
explainSELECT mb.id…… FROM mb,mbei,u WHERE mb.id=mbei.mb_id and mb.uid=u.user_idorder by mbei.apply_time desclimit 0,10
立竿见影,驱动表一样是小表 mbei:
id select_type table type possible_keys key key_len ref rows Extra1 SIMPLE mbei ALL mb_id (NULL) (NULL) (NULL) 13388 Using filesort1 SIMPLE mb eq_ref PRIMARY,userid PRIMARY 4 mbei.mb_id 11 SIMPLE u eq_ref PRIMARY PRIMARY 4 mb.uid 1 Using index
三、总结
1、不要过于相信你的运气!
2、不要相信你的开发环境里SQL的执行速度!
3、请拿起 explain 武器,如果你看到以下现象,请优化:
1)出现了Using temporary
2)rows过多,或者几乎是全表的记录数
3)key 是 (NULL)
4)possible_keys 出现过多(待选)索引
- 了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表
- MySQL联表查询中的驱动表
- 【explain】MySQL联表查询中的驱动表
- 【explain】MySQL联表查询中的驱动表
- Mysql 优化之小表驱动大表
- MySql 小表驱动大表
- MySql 小表驱动大表
- 连表查询之驱动表
- Mysql 大表查询效率
- 【慢查询优化】连表查询注意谁是驱动表&搞不清楚谁join谁更好时放手让mysql自行判定
- 【慢查询优化】连表查询注意谁是驱动表&搞不清楚谁join谁更好时放手让mysql自行判定
- 优化mysql嵌套查询和联表查询
- 优化MySQL嵌套查询和联表查询
- [慢查优化]联表查询注意谁是驱动表 & 你搞不清楚谁join谁更好时请放手让mysql自行判定
- [慢查优化]联表查询注意谁是驱动表 & 你搞不清楚谁join谁更好时请放手让mysql自行判定
- [慢查优化]联表查询注意谁是驱动表 & 你搞不清楚谁join谁更好时请放手让mysql自行判定
- MySQL表查询优化(一):妙用explain中的type指标
- 使用临时表优化大表查询
- three.js学习笔记(二)-基础知识①
- Java知识---类的继承
- 二进制程序包MariaDB的配置实现
- 将JavaBean对象的全部属性(包括父类属性)存放于map中的方法
- @Controller和@RestController的区别?
- 了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表
- c++支持ipv6_Only,ip必须使用域名,否则ios9会失败~
- 20171014redis
- Git文件夹和文件图标不显示(Git)
- 设计模式之代理模式
- 内连接(inner join)与外连接(outer join)小结
- js基本数据类型-深入讲解(1)
- jquery选择器如何获取父级元素、同级元素、子元素
- 运算符的区别与优先级