免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1297 | 回复: 0

为什么Left join一张视图和直接把查询语句拆出来,效率差10倍? [复制链接]

论坛徽章:
0
发表于 2016-04-01 12:35 |显示全部楼层
表关系
单据表:jd,id主键,记录数5XX条
流程进度表:lcdj,id主键,jd_id(指向单据表的id,但是没有设置外键),status(状态:0正常,-1删除),其他lcjd_id(流程进度id,对应code表id==lcjd.id的名称),记录数22xx条
流程进度视图:v_cljd,对lcjd表中的lcjd.id代码用left join进行翻译
当前流程进度视图:select * from v_cljd where status=0,即v_lcjd中status=0的记录。
执行时间如下:
SELECT jd.id FROM jd LEFT JOIN v_dqlcjd ON jd.id = v_dqlcjd.jd_id
耗时 0.99
SELECT jd.id FROM jd LEFT JOIN v_lcjd ON jd.id = v_lcjd.jd_id where v_lcjd.`status` = 0
耗时0.006
mysql> show profiles;
+----------+------------+-----------------------------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                                   |
+----------+------------+-----------------------------------------------------------------------------------------+
|        1 | 0.99802075 | SELECT jd.id FROM jd LEFT JOIN v_dqlcjd ON jd.id = v_dqlcjd.jd_id                       |
|        2 |  0.0015355 | explain SELECT jd.id FROM jd LEFT JOIN v_dqlcjd ON jd.id = v_dqlcjd.jd_id               |
|        3 |   0.006792 | SELECT jd.id FROM jd LEFT JOIN v_lcjd ON jd.id = v_lcjd.jd_id where v_lcjd.`status` = 0 |
+----------+------------+-----------------------------------------------------------------------------------------+
3 rows in set

mysql> explain SELECT jd.id FROM jd LEFT JOIN v_dqlcjd ON jd.id = v_dqlcjd.jd_id ;
+----+-------------+-------+--------+-----------------+-----------------+---------+-----------------+------+-------------+
| id | select_type | table | type   | possible_keys   | key             | key_len | ref             | rows | Extra       |
+----+-------------+-------+--------+-----------------+-----------------+---------+-----------------+------+-------------+
|  1 | SIMPLE      | jd    | index  | NULL            | PRIMARY         | 4       | NULL            |  567 | Using index |
|  1 | SIMPLE      | lcjd  | ref    | IND_LCJD_STATUS | IND_LCJD_STATUS | 5       | const           |   10 |             |
|  1 | SIMPLE      | clcjd | eq_ref | PRIMARY         | PRIMARY         | 4       | fz.lcjd.lcjd_id |    1 | Using index |
+----+-------------+-------+--------+-----------------+-----------------+---------+-----------------+------+-------------+
3 rows in set

mysql> explain SELECT jd.id FROM jd LEFT JOIN v_lcjd ON jd.id = v_lcjd.jd_id where v_lcjd.`status` = 0  ;
+----+-------------+-------+--------+-----------------+-----------------+---------+-----------------+------+--------------------------+
| id | select_type | table | type   | possible_keys   | key             | key_len | ref             | rows | Extra                    |
+----+-------------+-------+--------+-----------------+-----------------+---------+-----------------+------+--------------------------+
|  1 | SIMPLE      | lcjd  | ref    | IND_LCJD_STATUS | IND_LCJD_STATUS | 5       | const           |  594 | Using where              |
|  1 | SIMPLE      | jd    | eq_ref | PRIMARY         | PRIMARY         | 4       | fz.lcjd.jd_id   |    1 | Using index              |
|  1 | SIMPLE      | clcjd | eq_ref | PRIMARY         | PRIMARY         | 4       | fz.lcjd.lcjd_id |    1 | Using where; Using index |
+----+-------------+-------+--------+-----------------+-----------------+---------+-----------------+------+--------------------------+
3 rows in set

为什么会有这样的差距?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP