8.6 SQL优化(2)
order by优化
(1)Using filesort:通过表的索引或全面扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序。
(2)Using index:通过有序索引顺序扫描直接返回有序数据,这种情况为Using index,不需要额外排序,操作效率高。
没有创建索引时,根据age,phone进行排序
explain select id,age,phone from tb_user order by age,phone;
创建索引
create index idx_user_age_phone_aa on tb_user(age,phone);
创建索引后,根据age,phone进行升序排序
explain select id,age,phone from tb_user order by age,phone;
创建索引后,根据age,phone进行降序排序
explain select id,age,phone from tb_user order by age desc,phone desc;
//最左法则是不看where的顺序,order by的顺序还是要看的
(3)
根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
尽量使用前缀索引。
多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)
如果不可避免的出现filesort,大量数据排序时,可以适当增加排序缓冲区大小sort_buffer_size(默认256K)
group by优化
删除掉目前的联合索引 idx_user_pro_age_sta
drop index idx_user_pro_age_sta on tb_user;
执行分组操作,根据profession字段分组
explain select profession,count(*) from tb_user group by profession;
创建索引
create index idx_user_pro_age_sta on tb_user(profession,age,status);
执行分组操作,根据profession字段分组
explain select profession,count(*) from tb_user grounp by profession;
执行分组操作,根据profession字段分组
explain select profession,count(*) from tb_user grounp by profession,age;
所有的查询都有个前提条件,为覆盖索引。
浙公网安备 33010602011771号