排序与索引
SQL中很多操作需要排序,最明显的就是ORDER BY 了。ORDER BY 通常会有两种实现方法,一个是利用有序索引自动实现,也就是说利用有序索引的有序性就不再另做排序操作了。另一个是把结果选好之后再排序。用有序索引这种,当然是最快的,不过有一些限制条件,当order by 字段出现在where条件中时,才会利用索引而无需排序操作。其他情况,order by不会出现排序操作。更准确的说,order by 中的字段在执行计划中利用了索引时,不用排序操作。
为什么只有order by 字段出现在where条件中时,才会利用该字段的索引而避免排序。这要说到数据库如何取到我们需要的数据了。
一条SQL实际上可以分为四步。
1.寻找数据(根据WHERE条件)
2.得到数据(select中的列)
3.处理数据 (对需要的数据进行处理,如GROUP BY 、ORDER BY、 SUM 、union等)
4.返回处理后的数据
事实上,索引只在第一步得到数据,也就是查找数据时有用。也就是,只有当寻找数据时才会访问索引,当处理数据时,并不会访问索引。但是为什么索引会使ORDER BY、GROUP BY、UNION等变快呢?显然ORDER BY、GROUP BY、UNION都是需要排序的操作,如果之前第二步得到的结果集已经是有序的了,那么就不需要排序了。可以大大提高效率。可是如何知道第二步时结果集是有序的呢?就是看在第一步时是否利用了要排序字段的索引。那么什么样的情况下会利用索引呢。也就是第一步根据WHERE条件寻找满足条件数据时,是否利用了索引。一般来说,当ORDER BY中的字段在WHERE条件中且该字段有索引时,ORDER BY或者或其他需要排序的字段(GROUP BY、UNION等)就不需要排序了。
函数与索引
为什么当WHERE条件中的左边列利用了函数时,就不会利用索引了呢?
比如一个学生表有姓名、学号、性别,出生日期等列。这些信息放在磁盘的某个地方。这里我暂时称为表A。现在为了查询方便建立出生日期列的索引。这就相当于,建立了只有两列表,这两列为出生日期和该出生日期值对应的完整记录在磁盘(表A存储信息的位置)中位置。并且这个表是根据出生日期排列的,它也放在磁盘的某个地方。这里我称它为表B。
当我们查询学生信息时,如果WHERE条件中有出生日期的条件,那么会先查询这个表B。比如条件为WHERE 出生日期 >1990.1.1,那么就先查询表B中那些行数据的出生日期大于这个值。然后看这些数据对应的完整记录的位置。然后从这些位置读取需要的数据。这样就利用索引来提高了查询速度。
当我们在WHERE条件的左边使用了函数时,比如where substr('出生日期',0,4) > 1990时,我们知道出生日期建立了一个索引,也就是表B。我们在表B中取出出生日期的值,然后经过函数运算,再看是否满足条件。注意,经过函数运算后的值我们不能保证是有序的。所以,必须B表中每一列都要经过函数运算再看是否满足条件。这样表B就进行了全表扫描。可是这就失去了利用索引的有序性来筛选提高查询速度的效果,和直接扫描表A得到数据相比,会更慢。有一个经验,如果索引的筛选率小于30%,那么不走索引就更快了。
假如我们将条件变成where 出生日期 >1990.12.31,那么就可以利用索引了。
所以,尽量避免在WHERE条件表达式的左边使用函数。
如果必须使用函数,那么可以考虑建立函数索引。比如,之前的where substr('出生日期',0,4) > 1990。如果建立了substr('出生日期',0,4)这个函数索引,也就是建立了一个表C,其中有两列信息,一列是substr('出生日期',0,4)的值,一列是出生日期对应的完整记录的位置。这样就可以利用索引了。
分享到:
相关推荐
### 关于索引概念、特点、优点、缺点、分类及使用的详细解读 #### 索引的概念 在数据库管理系统(DBMS)中,索引是一种数据结构,它可以帮助快速定位数据库表中的数据记录,从而提高数据检索的速度。索引类似于...
本篇文章将详细讲解MySQL中关于索引的相关知识点,包括索引的数据结构及其优劣,以及如何查看和分析SQL执行计划。 1. **索引的数据结构** - **哈希索引**:适用于单条记录查询,哈希索引通过哈希函数将键值转化为...
以上就是Elasticsearch RestHighLevelClient关于索引库和文档的基本操作。在实际应用中,还需要考虑错误处理、集群配置、性能优化等因素。了解并熟练掌握这些操作,将有助于我们更好地利用Elasticsearch来管理和检索...
在Oracle数据库中,索引分为B树索引、位图索引、函数索引等多种类型,每种都有其特定的应用场景和优缺点。 二、B树索引 B树索引是最常见的索引类型,适用于全值匹配查询。在Oracle中,B树索引由一个或多个索引块...
MySQL中的索引是数据库性能优化的关键工具,它能显著提高数据检索的速度。下面将详细讨论索引的类型、存储方式以及可能导致索引失效的场景。 首先,我们来看一下索引的类型: 1. **主键索引(Primary Key Index)*...
### C#中的索引器详解 #### 一、索引器概述 索引器是C#语言提供的一个特性,它允许我们像操作数组那样通过索引来访问类或结构体的实例成员。通常情况下,当我们想要根据某个键或者索引来获取或设置对象内部的数据...
MySQL数据库中的索引是提高查询效率的关键技术,尤其是在处理大量数据时。本文主要探讨了MySQL数据库索引的原理、类型和优化方法。作者通过实例分析,展示了索引在解决数据库性能问题上的重要作用。 首先,作者指出...
在阿里的面试中,索引是一个重要的讨论话题,特别是对于处理大数据量的系统而言。索引是一种特殊的数据结构,它被用来加速数据库中的数据检索。面试官和面试者讨论了几个关键的索引概念和技术,包括: 1. **索引...
这是数据库课后的一个习题,由于本人初学者,做的不是很好,不过还是希望可以帮到你。
通过上述命令,我们可以获取到关于索引的详细信息,包括扫描页数、扫描扩展盘区数、扩展盘区开关数等。这些指标可以帮助我们评估索引的健康状况,进而决定是否需要对索引进行优化。 #### 五、解决索引碎片的方法 ...
如果你运行这个向导,你会看到关于数据库中关于索引的统计量,这些统计量作为日志工作并定时更新,这样就减轻了手工重建索引所带来的工作量。如果你不想自动维护索引,那么你可以手工重建索引,并在需要时执行 ...
关于索引的常识影响到数据库性能的最大因素就是索引。由于该问题的复杂性,我只可能简单的谈谈这个问题,不过关于这方面的问题,目前有好几本不错的书籍可供你参阅。我在这里只讨论两种SQLServer索引,即clustered...
关于索引使用的一些参考经验: 1. 无法使用索引的场景 索引并不总是有用的,有些情况下,索引可能会降低性能。例如,如果查询语句中的 WHERE 子句中包含多个列,而这些列都有索引,那么索引可能会被忽略。 2. ...
- `comment`: 关于索引的注释。 - `index_comment`: 索引的用户定义注释。 #### 四、检查MySQL索引是否生效 为了确保索引能够正常工作并提高查询效率,我们需要验证索引是否被实际使用。这通常通过`EXPLAIN`命令来...
根据“索引使用规则.txt”文件提供的信息,我们可以深入探讨一系列关于索引使用的最佳实践与限制条件,以下是对这些规则的详细解析: ### 1. 索引与逻辑运算符的兼容性 当在WHERE子句中使用`NOT`或`LIKE '%XX%'`这...
通过解析这个DDL语句,我们可以获得关于索引的所有细节,包括它所基于的表和列。 ### 结论 查询索引对应的表和列对于理解数据库结构、优化查询效率以及进行数据库维护至关重要。通过以上介绍的两种方法——查询...
接下来,文件中提到了几个关于索引使用的常见误区: 1. 索引并非越多越好。虽然索引可以加快查询速度,但过多的索引会降低更新操作的效率,因为每次数据变更操作都需要更新所有相关索引。因此,创建索引时应该进行...
关于索引的最佳实践,有以下几点值得注意: 1. **选择合适的数据类型**:索引的性能与数据类型密切相关,尽可能使用占用空间小且排序效率高的数据类型。 2. **主键索引**:每个表应有一个唯一的主键,这将自动创建...
Richard Foote:1982年从英国移民到澳洲堪培拉,1996年进入ORACLE公司,2002年离开ORACLE,从事ORACLE咨询服务。其专长是对ORACLE索引的深入研究,揭示了我们看不到的地方。