标签:
最近同事在执行线上执行一条MySQL的查询语句,数据的话在9000条左右,但使用左连接的时候查询速度大概在15秒左右~这速度确实是无法接受的~
经过简单的修改,变为内连接的话,执行速度不到1秒。
下面是两条具体的sql:
左连接的sql如下:
SELECT count(*) FROM investment i LEFT JOIN payment m ON m.bill_id = i.id;
执行结果如下:
使用内连接的sql如下:
SELECT count(*) FROM investment i INNER JOIN payment m ON m.bill_id = i.id;
执行结果如下:
正常情况执行时间不应该出现这么大的差距啊~~
这时想起了mysql的执行计划关键字explain,我们分别对这两条sql执行explain语句,我们得到的结果如下:
对于使用左连接的情况如下:
对于使用内连接的情况如下:
通过比较这两个explain的扫描元素字段 rows可以发现,对于investment而言,如果使用左连接扫描的个数为9420,而如果使用内连接的话,扫描表中元素的个数为1,由此可见左连接和内连接
在此查询的时候扫描元素的差距之大~~由于本人能力有限,不是专业的DBA,至于为什么左连接相对于内连接而言,扫描的表中的元素会多出这么多,也是一知半解~~
后面附上MsSQL执行关键字explain的讲解~~
EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2. EXPLAIN PARTITIONS SELECT …… 用于分区表的EXPLAIN
执行计划包含的信息
包含一组数字,表示查询中执行select子句或操作表的顺序
id相同,执行顺序由上至下
如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
本文是我从简朝阳推荐的ppt转换为网页版的,原ppt下载:下载地址
参考链接:http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html
标签:
原文地址:http://www.cnblogs.com/xiohao/p/4890980.html