mysql文件排序消除

187 阅读1分钟
  • 当sql中where条件中有等值和非等值条件时,并且能够命中索引,这时候需要排序操作,那么排序操作的字段应该在联合索引中最后一个等值条件的后面,这样就能消除文件排序。
select * from user where name='zhangsan' and age='18' and gride > 5 order by id desc
如果联合索引为: index(`name`,`age`,`gride`),则会有文件排序,但是数据过滤的时候会用到所有字段
如果联合索引为: index(`name`,`age`,`id`,`gride`) 则不会有索引排序,但是索引只能用到`name`和`age`
  • 为什么联合索引为: index(name,age,id,gride),时能消除文件排序呢? 这样创建索引,按照B+树的原理来说,当name和age确定的时候,叶子结点的链表按照id来说就天然有序了,所以能够消除文件排序

  • 这样做后消除了文件排序一定比之前好么? 不一定,在消除文件排序的同时,失去了后面不等值条件数据过滤的索引字段,实际效果还要实测。