数据库
首页 > 数据库> > MySQL 高级(2): 索引优化(关联,排序,分组,案例)

MySQL 高级(2): 索引优化(关联,排序,分组,案例)

作者:互联网

准备

关联查询优化

左联查询(left join)

内联查询(inner join)

四关联案例查询分析

场景1:

场景2:

子查询优化

原场景:

排序分组优化

where 条件和 on 的判断这些过滤条件,作为优先优化的部门,是要被先考虑的!其次,如果有分组和排序,那么也要考虑 grouo by 和 order by。

无过滤不索引

顺序错,必排序:(filesort)

结论1: 当 排序中存在为建立索引的字段,会产生 filesort

结论2: where 两侧列的顺序可以变换,效果相同,但是 order by 列的顺序不能随便变换!

结论3: 最左匹配。必须先 age 再id。顺序错,还是会调用 filesort。

方向反,必排序(filesort)

索引的选择(排序 or 过滤?)

filesort

具体的排序算法

单路排序的问题

由于单路是后出的,总体而言好过双路。但是存在以下问题:

为了能够减少 IO 的次数,我们可以通过下面这些操作进行调节:

覆盖索引的使用

SQL 只需要通过索引就可以返回查询所需要的数据,而不必通过二级索引查到主键之后再去查询数据。
在这里插入图片描述

group by

group by 使用索引的原则几乎跟 order by 一致 ,唯一区别是 groupby 即使没有过滤条件用到索引,也可以直接使用索引。
在这里插入图片描述

索引优化案例

案例一:列出自己的掌门比自己年龄小的人员

select e1.name empname,e1.age empage,e2.name ceoname,e2.age ceoage
# 内联,找到有门派的所有成员(内联不包含没有门派的成员)
from t_emp e1 inner join t_dept d on e1.deptid=d.id
# 内联:找到每个门派对应的掌门的具体信息
inner join t_emp e2 on d.ceo=e2.id
# 判断过滤
where e1.age>e2.age;

在这里插入图片描述
如上所示,两个被驱动表都用上了索引。

案例二:列出所有年龄低于自己门派平均年龄的人员

案例三:列出至少有 2 个年龄大于 40 岁的成员的门派

案例四: 至少有 2 位非掌门人成员的门派

案例五:列出全部人员,并增加一列备注“是否为掌门”,如果是掌门人显示是,不是掌门人显示否

案例六:列出全部门派,并增加一列备注“老鸟 or 菜鸟”,若门派的平均值年龄>40 显示“老鸟”,否则显示“菜鸟”

案例七:显示每个门派年龄最大的人

在这里插入图片描述

标签:deptid,age,索引,分组,emp,MySQL,VALUES,card
来源: https://blog.csdn.net/Mr_tianyanxiaobai/article/details/119892672