fagz

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;

所有的查询都有个前提条件,为覆盖索引。

posted on 2025-08-06 18:06  fagz  阅读(8)  评论(0)    收藏  举报

导航