您的位置 首页 数据库

索引扩展信息Extar列

索引扩展信息

Extar列表示额外的情况或额外的信息说明,其中重点需要关注点信息为:filesort 表示涉及到额外排序操作,将严重浪费CPU资源;

 

哪些查询语句情况涉及到排序操作:

  • 情况一:查询语句中含有 order by ,表示触发式的排序;
  • 情况二:查询语句中含有 group by,表示隐藏式的排序;
  • 情况三:查询语句中含有 DISTINCT,表示会先进行排序后再取消重复;

 

数据库查询出现排序情况演示说明

进入到world数据库中,查看city索引信息设置,并将额外无用索引进行清理:

# 查看指定表索引信息
mysql> use world;
mysql> show index from city;
​
# 删除无用索引信息
mysql> alter table city drop index ix_na_po;
mysql> alter table city drop index ix_n;
mysql> alter table city drop index idx;

 

利用辅助索引信息作为条件,查看所有中国的城市情况信息:

mysql> select * from city where countrycode='CHN';
mysql> desc select * from city where countrycode='CHN';
-- 获取默认查询执行计划情况

在没有进行排序前的执行计划情况:

模拟出现查询数据的排序情况:

# 模拟情况一:利用order by实现排序
mysql> desc select * from city where countrycode='CHN' order by population;

执行计划优化处理:

# 错误设想创建索引:因为本身索引构建过程就存在自动排序问题
alter table city add index idx(population)

没有改变最终的执行计划结果,因为在使用索引时,只能使用单一的索引树,不能跨越多颗索引树进行使用,因此优化失败;

# 正确优化处理方式:创建联合索引
mysql> alter table city add index idx1(countrycode,population);

特殊情况说明:在order by信息出现在group by之后,是无法实现索引优化处理的

# 模拟情况二:利用group by实现排序
mysql> desc select district,count(*) from city where countrycode='CHN' group by district;
mysql> desc select district,count(*) from city where countrycode='CHN' group by district order by sum(population);

从上图执行计划输出信息可以看出,因为group by操作后,已经将数据信息存放在了临时表中,order by排序就不能再用索引了;

欢迎来撩 : 汇总all

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章