目录
- 一、驱动表的介绍与选择
- 1.mysql的优化器如何选择驱动表?
- 二、join优化实例(重点)
- 1.女性客户数量与平均薪资 & 不同城市客户数量与平均薪资
- 2.列出没有手机号码,或者没有照片,或者没有年终奖的客户姓名
- 3.join优化思路:
- 4.索引icp的解释
- 三、where过滤运行过程(理解即可)
一、驱动表的介绍与选择
1.mysql的优化器如何选择驱动表?
联合查询的类型:
left join – 左边是驱动表,右边的作为被驱动表
right join – 右边是驱动表,左边的作为被驱动表
inner join – 查询的结果集数据量少,消耗少的表作为驱动表
驱动表的选择本质:会根据索引以及where条件过滤数据之后
选择结果集更小的表
作为驱动表
二、join优化实例(重点)
1.女性客户数量与平均薪资 & 不同城市客户数量与平均薪资
覆盖索引 优化
desc customers1;
desc salary;
show index from customers1;
show index from salary;
select count(*),avg(salary.monthsalary) from customers1 inner join salary on customers1.id = salary.id where customers1.gender = 0;
select count(*),avg(salary.monthsalary) from customers1 inner join salary on customers1.id = salary.id group by customers1.city;
子查询优化 版本5.7以上才适用(会把子查询转换为 join),5.6的版本建议大家适用上面的覆盖索引
select count(*),avg(salary.monthsalary) from salary where id in
(
select id from customers1 where gender = 0
)
select count(*),avg(salary.monthsalary) from salary where id in
(
select id from customers1 where group by
)
2.列出没有手机号码,或者没有照片,或者没有年终奖的客户姓名
explain select `name` from customers1,salary where customers1.id=salary.id and (mobile = '0' or photo is null or salary.yearbonus = 0);
select `name` from customers1 where mobile = '0' or photo = '0'
union all
select `name` from customers1 where id in(
select id from salary where salary.yearbonus=0
)
alter table customers1 add index idx_mobile_photo_name(mobile,photo,`name`)
alter table salary add index idx_yearbonus(yearbonus);
3.join优化思路:
1.尽可能的减少join语句中的nested loop的循环次数,也就是驱动表的结果集尽可能的要小-》
以小的结果集驱动大的
四两拨千斤
2.优先优化nested loop的内层循环
保证被驱动表上的join条件字段
以及被索引的目的
3.join语句的关联字段确定是索引字段
4.当无法保证驱动表join条件字段被索引并且内存资源充足,join BUFFER
all index range
4.索引icp的解释
icp:是mysql利用索引和筛选字段在where中从表中提取数据记录的一种优化
开启icp 可以通过where查询过滤掉
很多不与索引匹配或者不与where匹配的数据
开启icp语句
set @@optimizer_switch="index_condition_pushdown=on";
set profiling=1;
三、where过滤运行过程(理解即可)