美文网首页
mysql-为排序使用索引order by,group by

mysql-为排序使用索引order by,group by

作者: 有心人2021 | 来源:发表于2020-02-26 11:30 被阅读0次
一.排序原则的纲领
原则.png
二.case
  • case1
CREATE TABLE `tblA`( 
  `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,  
   `age` INT(11) DEFAULT NULL,   
   `birth` timestamp not NULL 
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
insert into tblA(age,birth) values (22,now());
insert into tblA(age,birth) values (23,now());
insert into tblA(age,birth) values (24,now());
 
create index idx_A_ageBirth on tblA(age,birth);
select * from tblA;

explain select * from tbla where age>20 order by age;
explain select * from tbla where age>20 order by age,birth;
explain select * from tbla where age>20 order by birth;
explain select * from tbla where age>20 order by birth,age;
explain select * from tbla order by birth;
explain select * from tbla where birth>'2018-10-05 12:00:00' order by birth;
explain select * from tbla where birth>'2018-10-05 12:00:00' order by age;
explain select * from tbla order by  age asc, birth desc;

分析.png
  • order by使用索引,的关键就看,是否产生了Using filesort.

  • mysql默认的排序是asc。而现在提交的birth是desc,所以mysql会在内部产生一个内部排序,再提交。所以,有Using filesort。

  • MySQL支持二种方式的排序,FileSort和Index,Index效率高,它指MySQL扫描索引本身完成排序。FileSort方式效率较低。

  • case2
    index ---->a_b_c(a,b,c)
    1.order by 能使用索引最做前缀

- ORDER BY a
- ORDER BY a,b
- ORDER BY a,b,c
- ORDER BY a DESC,b DESC,c DESC
  • 2.如果WHERE使用索引的最左前缀定义为常量,则ORDER BY 能使用索引
-WHERE a = const  ORDER BY b,c
-WHERE a = const AND b = const ORDER BY c
-WHERE a = const  ORDER BY b,c
-WHERE a = const AND b > const ORDER BY b,c
  • 3.不能使用索引排序
-ORDER BY a ASC,b DESC,c DESC /*排序不一致*/
-WHERE g = const ORDER BY b,c    /*丢失a索引*/
-WHERE a = const ORDER BY c     /*丢失b索引*/
-WHERE a = const ORDER BY a,d /*d不是索引的一部分*/
-WHERE a in(...) ORDER BY b,c /*对于排序来说,多个相等的条件也是范围查询*/
二. 总结
order by.png

如果不在索引列上,filesort有两种算法:mysql就要启动双路排序和单路排序


FileSort两种方式.png

针对这种情况,要避免多次io:


image.png
提高order by速度.png group by优化策略

相关文章

  • mysql-为排序使用索引order by,group by

    一.排序原则的纲领 二.case case1 order by使用索引,的关键就看,是否产生了Using file...

  • mysql order by 排序

    mysql order by 排序 索引排序 参考 order by 字段上上有索引可能就会用上索引排序,是否应用...

  • sql优化

    优化查询基础 为所有的join,where,order by和group by 中的条件简历索引 避免在条件中使用...

  • order by 关键字的排序优化

    ORDER BY 子句,尽量使用index方式排序,避免使用FileSort方式排序。 建表 插入数据 创建索引 ...

  • MySQL最佳实践

    索引使用策略及优化 创建索引 在经常查询而不经常增删改操作的字段加索引。 order by与 group by 后...

  • 【MySQL】16|“order by”是怎么工作的

    我们经常会使用order by进行排序,现在我们来聊聊它是怎么工作的。 例如: 1、全字段排序 前面介绍过索引,为...

  • order by 和 索引

    1、 order by 排序字段和索引 2、 order by 排序字段对其他字段索引的影响 3、 mysql是怎...

  • MySQL Point

    1.索引 group by where having order byhttps://blog....

  • MySQL数据库篇2

    直接进入正题。 关键词:order、group、alter、count 1. 查询排序(order by): ...

  • MySQL优化:order by和limit

    1. 对order by使用复合索引 order by和limit一起使用,避免引起全表扫描和数据排序是非常重要的...

网友评论

      本文标题:mysql-为排序使用索引order by,group by

      本文链接:https://www.haomeiwen.com/subject/efqmchtx.html