最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

MySQL调优----LEFTJOIN_MySQL

来源:动视网 责编:小采 时间:2020-11-09 19:46:55
文档

MySQL调优----LEFTJOIN_MySQL

MySQL调优----LEFTJOIN_MySQL:前情提要 : 需求就是一个普通的两个表连接从而查询出详细信息。其中A表是大表, 测试数据都有数万条; B表是小表大概1000多条数据。 1. 为了赶工写出的未优化SQL(为突出主题, 返回字段用 * 代替不写出详细字段, WHERE条件也去掉了): SELECT *
推荐度:
导读MySQL调优----LEFTJOIN_MySQL:前情提要 : 需求就是一个普通的两个表连接从而查询出详细信息。其中A表是大表, 测试数据都有数万条; B表是小表大概1000多条数据。 1. 为了赶工写出的未优化SQL(为突出主题, 返回字段用 * 代替不写出详细字段, WHERE条件也去掉了): SELECT *
 前情提要 : 需求就是一个普通的两个表连接从而查询出详细信息。其中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的基础数据,再一次通过循环查询条件到第三个表中查询数据。 结论: 驱动表(前面表)的数据量决定了总扫描数。

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调优----LEFTJOIN_MySQL

MySQL调优----LEFTJOIN_MySQL:前情提要 : 需求就是一个普通的两个表连接从而查询出详细信息。其中A表是大表, 测试数据都有数万条; B表是小表大概1000多条数据。 1. 为了赶工写出的未优化SQL(为突出主题, 返回字段用 * 代替不写出详细字段, WHERE条件也去掉了): SELECT *
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top