mysql索引优化 - 子查询优化

结论: 在范围判断时,尽量不要使用 not in 和 not exists,使用 left join on xxx is null 代替。

取所有不为掌门人的员工,按年龄分组!
select age as '年龄', count(*) as '人数' from t_emp where id not in (select ceo from t_dept where ceo is not null) group by age;

如何优化? 1 解决 dept 表的全表扫描,建立 ceo 字段的索引:
                  2 语句改成left join的方式

select age as '年龄',count(*) as '人数' from emp e left join dept d on e.id=d.ceo where d.id is null group by age; (推荐)


为方便理解上面的sql,个人做了个简单的Demo
两张表 img_type,img
  

--sql-1 不推荐
SELECT imgname , COUNT(*)  FROM img WHERE typeid NOT IN (SELECT typeid FROM img_type WHERE typeid IS NOT NULL) GROUP BY imgname;

--sql-2 推荐
SELECT imgname ,COUNT(*)  FROM img LEFT JOIN img_type ON img.typeid=img_type.typeid WHERE img_type.typeid IS NULL GROUP BY imgname;

--sql-3 方便理解,测试用
SELECT * FROM img LEFT JOIN img_type ON img.typeid=img_type.typeid

 前两个sql运行结果

第三个sql运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值