免费注册 查看新帖 |

Chinaunix

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

left join 与 not in 语句 调优 [复制链接]

论坛徽章:
9
射手座
日期:2014-07-29 13:05:07双子座
日期:2015-01-11 17:01:522015年亚洲杯之朝鲜
日期:2015-02-01 16:14:282015亚冠之阿尔艾因
日期:2015-06-04 17:54:40数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-11-26 06:20:0015-16赛季CBA联赛之天津
日期:2016-06-20 17:09:2015-16赛季CBA联赛之青岛
日期:2017-02-26 15:54:19
发表于 2015-12-03 20:08 |显示全部楼层
本帖最后由 stupid_lee 于 2015-12-03 20:10 编辑

有两张表
a表  t_char_basic  字段c_cid 为主键      10万条数据
b表  t_uid_sid_map  字段c_uid,c_cid 为联合主键      10万条数据

现在需要找出在a表中出现,但不在b表中出现的cid,分别使用如下sql语句
  1. [root@localhost] (ProjectM) 19:58> explain  select c_uid,c_cid from t_char_basic where c_cid not in (select distinct c_cid from t_uid_sid_map);
  2. +----+-------------+---------------+-------+---------------+-------+---------+------+--------+--------------------------+
  3. | id | select_type | table         | type  | possible_keys | key   | key_len | ref  | rows   | Extra                    |
  4. +----+-------------+---------------+-------+---------------+-------+---------+------+--------+--------------------------+
  5. |  1 | PRIMARY     | t_char_basic  | index | NULL          | c_uid | 4       | NULL | 126173 | Using where; Using index |
  6. |  2 | SUBQUERY    | t_uid_sid_map | ALL   | NULL          | NULL  | NULL    | NULL | 108049 | NULL                     |
  7. +----+-------------+---------------+-------+---------------+-------+---------+------+--------+--------------------------+
  8. 2 rows in set (0.00 sec)

  9. [root@localhost] (ProjectM) 19:59> explain select a.c_uid,a.c_cid from t_char_basic a left join t_uid_sid_map b on a.c_cid=b.c_cid where b.c_cid is null;
  10. +----+-------------+-------+-------+---------------+-------+---------+------+--------+----------------------------------------------------------------+
  11. | id | select_type | table | type  | possible_keys | key   | key_len | ref  | rows   | Extra                                                          |
  12. +----+-------------+-------+-------+---------------+-------+---------+------+--------+----------------------------------------------------------------+
  13. |  1 | SIMPLE      | a     | index | NULL          | c_uid | 4       | NULL | 126173 | Using index                                                    |
  14. |  1 | SIMPLE      | b     | ALL   | NULL          | NULL  | NULL    | NULL | 108049 | Using where; Not exists; Using join buffer (Block Nested Loop) |
  15. +----+-------------+-------+-------+---------------+-------+---------+------+--------+----------------------------------------------------------------+
  16. 2 rows in set (0.00 sec)
复制代码
看起来扫描的行都差不多,但是我执行第一条sql语句0.23秒就出来结果了
第二条 left join 卡了很久,几乎5分钟才出来结果
show processlist 显示 一直在sending data ,不知道为什么left join 比 not in 效率低这么多,求解

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-11-17 06:20:00数据库技术版块每日发帖之星
日期:2015-11-18 06:20:00数据库技术版块每日发帖之星
日期:2015-11-30 06:20:00数据库技术版块每月发帖之星
日期:2016-01-07 23:03:06数据库技术版块每周发帖之星
日期:2016-01-07 23:06:31数据库技术版块每周发帖之星
日期:2016-01-07 23:06:47数据库技术版块每日发帖之星
日期:2016-01-14 06:20:00
发表于 2015-12-11 13:31 |显示全部楼层
not in 或者not exist 只需要判断数据在或者不在 返回结果是true or false,但使用left join,需要实际关联每条数据,实际消耗资源更多,而且还会临时表。(通过show profile可以看到)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP