MySQL调优 —— LEFT JOIN
来源:互联网 发布:甩手掌柜软件 编辑:程序博客网 时间:2024/05/16 01:06
前情提要 : 需求就是一个普通的两个表连接从而查询出详细信息。其中A表是大表, 测试数据都有数万条; B表是小表大概1000多条数据。
1. 为了赶工写出的未优化SQL(为突出主题, 返回字段用 * 代替不写出详细字段, WHERE条件也去掉了):
SELECT * FROM A a LEFT JOIN B b ON a.JOB_ID = b.ID
耗时:3.712s
rows字段代表这个步骤相对上一步结果每一行需要扫描的行数,可以看到这个sql需要扫描的行数为22711*1230, 这几乎是两个表做笛卡尔积的开销了(select * from a, b)。
MySQL对JOIN的处理采用了一种叫做BLOCK Nested-Loop 的算法。 Block Nested-Loop 算法是通过驱动表(可以简单理解为前面的表)的结果集作为循环基础数据, 然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。 如果还有第三个参与 JOIN, 则再通过前面两个表的 JOIN 结果集作为JOIN的基础数据,再一次通过循环查询条件到第三个表中查询数据。 结论: 驱动表(前面表)的数据量决定了总扫描数。 MySQL 优化器会帮助选择出最优的驱动表, 所以不需要我们去定义哪个是驱动表。
2. 从业务上
都是全表扫描, 然后我发现左表数据在业务上如果右表为NULL就没意义了, 然后改为INNER JOIN。
耗时: 2.745s
3. 可以看到上面的type都是ALL
system/const/eq_ref/ref/range/index/ALL ---- 从左到右效率递减
都是type都是ALL考虑到连接的条件是否可以为主键, 有主键的话MySQL可以使用索引查询, 效率会提升很多。
由于A表是历史表做链接的字段不是主键, 所以只能在B表把这个字段加上主键。
耗时: 2.672s
还是很慢, 因为还没建立索引, 现在对B表ID字段加上索引, 结果如下:
耗时:0.109s
- MySQL调优 —— LEFT JOIN
- MySQL Left Join,Right Join
- MySQL Left Join,Right Join
- mysql left join right join
- MYSQl left join 分析
- LEFT JOIN in MySQL
- mysql left join分析
- MySQL:union、left join
- MySQL LEFT JOIN
- 关于MySql Left Join
- mysql left join
- mysql left join写法
- mysql update left join
- mysql update left join
- MySQL left join优化
- mysql left join right join inner join
- mysql left join,right join,inner join
- Mysql-left join,right join,inner join
- Blueberry Measuring Antioxidants
- 流程部署的几种方式
- 安装Linux系统分区
- go 速学 - 08 - Map
- 秒开Android 离线文档并保留搜索功能无需断网
- MySQL调优 —— LEFT JOIN
- JavaWeb-20 (JDBC之文件上下传与JavaMail)
- Windows下Python安装whl格式包问题。
- Android音频实时传输与播放(四):源码下载(问题更新)
- 【C语言】[其他]:宏定义swap(x,y)
- 一张表中有三个值A/B/C,三者为A-B-C树状结构关系,如何查询出值C大于100的A值
- https通信的一些理解
- 我最喜欢的几本书《C++Primer》、《OpenGL编程指南》 and so on
- epoll 内核实现