B+树索引使用(8)排序使用及其注意事项(二十)

简介: B+树索引使用(8)排序使用及其注意事项(二十)

上篇文章我们介绍了匹配列前缀,因为索引排序按字母一个个比较的特性,如果%在前面则不能触发索引,还有范围匹配,范围查询的时候,最左边的列可以触发索引,当前面有精确值的时候,比如name = ‘’,第二个范围也能触发索引,之后的则不可以触发索引。

B+树索引使用(7)匹配列前缀,匹配值范围(十九)


排序


我们用sql的时候是否都用过order by。传统的排序要不在内存中排序或者磁盘中排序,内存中排序可以用一些排序算法,快速排序,归并排序等,排序好之后,再把结果返回给客户端。在mysql中,在磁盘或者内存中排序的方法统一称为文件排序(英文名:filesort)。一般和文件沾边的,就会很慢,磁盘和内存的速度比起来,就如同飞机比绿皮火车,甚至磁盘比绿皮火车还慢。但如果用到了order by语句,如:order by name,birthday,phone;这时候查询的结果先按name进行排序,name相同则按birthday进行排序,birthday相同,则按phone进行排序。因为b+树索引排序,本身就是按这个排序好的,所以省去了在内存或者磁盘中排序的开销,直接从数据库取数据。



联合索引排序注意事项


Order by排序的时候,后面跟着索引字段。而联合索引排序的时候需要注意:

1)、当order by name,birthday,phone时候,这时候会先按name进行排序,当相同的时候,会按birthday进行排序,还相同就按phone。

2)、当用order by phone,birthday,name排序的时候,则不会触发索引排序,原理和之前说的一样,因为需要先name相同,才会触发后面的排序。

或者前面取一个精确值where name = ‘A’ order by birthday,phone;

这时候后面的排序也会触发索引,原因和上面类似,说过很多遍。


不可以使用索引排序的几种情况


ASC、DESC混用


对于联合索引的使用场景,我们要求排序是一致的,要么按ASC排序,要么按DESC排序(当没写的时候,默认用ASC升序)。我们先回忆一下索引的排序结构:1)先按name排序。2)如果相同就按birthday排序。3)如何相同在按phone排序。如果排序一致的怎么取值呢?

order by name,birthday ASC limit 10;这时候只需要从索引最左边开始数10个。

order by name,birthday DESC limt 10;只需要从索引最右边开始数10个。

但是我们如果按name升序,在按birthday降序:

Order by name asc,birthday desc limit 10;这种情况下如果采用索引查找非常复杂,mysql设计者觉得这样还不如文件排序来的快,所以排序的时候必须一致性。


排序列包含非索引列


Order by name,country limit 10;name和country不属于联合索引,所以country肯定不会用索引排序。


排序使用复杂表达式


比如order by upper(name) limit 10;使用了upper之后就不是单独的列了,也无法使用搜索引擎。


相关文章
|
20天前
|
存储 关系型数据库 MySQL
MySQL索引简介(包含索引优化,索引失效,最左前缀简洁版)
MySQL索引简介(包含索引优化,索引失效,最左前缀简洁版)
28 0
|
9月前
|
索引
力扣34在排序数组中查找元素的第一个和最后一个位置:思路分析+图文详解+代码实现(最靠左索引,最靠右索引)
力扣34在排序数组中查找元素的第一个和最后一个位置:思路分析+图文详解+代码实现(最靠左索引,最靠右索引)
33 0
|
11月前
|
关系型数据库 MySQL 索引
新增数据时,MySQL索引树的自调整过程
刚开始你一个表建好后,就一个数据页,就是聚簇索引的一部分,而且还是空的。若你插入数据,就是直接往这数据页里插入,也没必要给他弄索引页
84 0
|
人工智能 算法 搜索推荐
|
存储 算法 搜索推荐
|
SQL 关系型数据库 MySQL
十七、复合索引最左特性
十七、复合索引最左特性
47 0
|
算法
数据结构上机实践第14周项目2 - 二叉树排序树中查找的路径
数据结构上机实践第14周项目2 - 二叉树排序树中查找的路径
数据结构上机实践第14周项目2 - 二叉树排序树中查找的路径
|
自然语言处理 算法 关系型数据库
常用查询算法(顺序扫描法)|学习笔记
快速学习常用查询算法(顺序扫描法)
232 0
|
存储 SQL 算法
FAQ系列 | B+树索引和哈希索引的区别
FAQ系列 | B+树索引和哈希索引的区别
159 0
FAQ系列 | B+树索引和哈希索引的区别
|
存储 SQL 缓存
B+树索引使用(9)分组、回表、覆盖索引(二十一)
B+树索引使用(9)分组、回表、覆盖索引(二十一)