http://blog.chinaunix.net/uid-27226965-id-4200305.html
ORDER BY 通常会有两种实现方法,一个是利用有序索引自动实现,也就是说利用有序索引的有序性就不再另做排序操作了。另一个是把结果选好之后再排序。
用有序索引这种,当然是最快的,不过有一些限制条件,来看下面的测试。
测试数据:student表有两个字段id ,sid ,id是主键。一共有20W条记录,id从1到200000,sid也是从1到200000的数据。
第一种情况 : order by的字段不在where条件也不在select中
select sid from student where sid < 50000 order by id;
第二种情况 : order by的字段不在where条件但在select中。
select id,sid from student where sid < 50000 order by id;
第三种情况 : order by的字段在where条件但不在select中。
select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id;
第四种情况 : order by的字段在where条件但不在select中。倒序排列
select sid from student where sid < 50000 and id < 50000 order by id desc;
测试结果:
order by的字段不在where条件不在select中 有排序操作
order by的字段不在where条件但在select中 有排序操作
order by的字段在where条件但不在select中 无排序操作
order by的字段在where条件但不在select中(倒序) 无排序操作
结论:
当order by 字段出现在where条件中时,才会利用索引而无需排序操作。其他情况,order by不会出现排序操作。
分析:
为什么只有order by 字段出现在where条件中时,才会利用该字段的索引而避免排序。这要说到数据库如何取到我们需要的数据了。
一条SQL实际上可以分为三步。
1.得到数据
2.处理数据
3.返回处理后的数据
比如上面的这条语句select sid from student where sid < 50000 and id < 50000 order by id desc
第一步:根据where条件和统计信息生成执行计划,得到数据。
第二步:将得到的数据排序。
当执行处理数据(order by)时,数据库会先查看第一步的执行计划,看order by 的字段是否在执行计划中利用了索引。如果是,则可以利用索引顺序而直接取得已经排好序的数据。如果不是,则排序操作。
第三步:返回排序后的数据。
另外:
上面的5万的数据sort只用了25ms,也许大家觉得sort不怎么占用资源。可是,由于上面的表的数据是有序的,所以排序花费的时间较少。如果 是个比较无序的表,sort时间就会增加很多了。另外排序操作一般都是在内存里进行的,对于数据库来说是一种CPU的消耗,由于现在CPU的性能增强,对 于普通的几十条或上百条记录排序对系统的影响也不会很大。但是当你的记录集增加到上百万条以上时,你需要注意是否一定要这么做了,大记录集排序不仅增加了 CPU开销,而且可能会由于内存不足发生硬盘排序的现象,当发生硬盘排序时性能会急剧下降。
注:ORACLE或者DB2都有一个空间来供SORT操作使用(上面所说的内存排序),如ORACLE中是用户全局区(UGA),里面有SORT_AREA_SIZE等参数的设置。如果当排序的数据量大时,就会出现排序溢出(硬盘排序),这时的性能就会降低很多了。
总结:
当order by 中的字段出现在where条件中时,才会利用索引而不排序,更准确的说,order by 中的字段在执行计划中利用了索引时,不用排序操作。
这个结论不仅对order by有效,对其他需要排序的操作也有效。比如group by 、union 、distinct等。
分享到:
相关推荐
通过合理利用索引,可以显著提升查询性能,减少不必要的磁盘I/O,从而提高系统整体的响应速度。在实际应用中,应根据查询模式和业务需求来选择合适的索引策略,避免创建冗余的索引,同时也要关注索引维护带来的额外...
它通过比较距离较远的元素来减少排序过程中的交换次数。希尔排序使用一个增量序列,逐步缩小间隔,使得元素可以更快地达到最终位置,从而提高了效率。 3. **冒泡排序**: 冒泡排序是一种简单的交换排序,通过不断...
- **排序列**:在经常需要排序的列上创建索引,以利用索引的排序顺序,减少排序时间。 - **WHERE子句列**:在经常出现在WHERE子句中的列上创建索引,以加快条件判断速度。 同时,应避免在以下情况下创建索引: - *...
- **插入排序原则**:通过逐个插入新元素的方式保持链表的有序性。 - **节点交换操作**:遍历链表,当发现元素顺序错误时,通过交换相邻节点的位置来调整顺序。 - **哨兵节点辅助**:在链表头部添加一个哨兵节点,...
因此,如果GROUP BY语句中的字段能够利用索引树的有序性,那么分组操作就可以直接在索引树上执行,而无需对原始数据进行排序或分组,大大减少了执行时间和资源消耗。 为了在使用GROUP BY时利用索引,通常推荐的策略...
不过这种情况在实际应用中很少出现,因为通常我们会选择一个随机元素作为基准,这有助于减少最坏情况发生的可能性。 总的来说,快速排序是一种非常实用的排序算法,它在C语言中实现起来也相对简单,只需要理解和...
如果表中有相应的索引,数据库系统可以利用索引的有序性,直接返回排序或分组后的结果,而无需对所有数据进行额外的排序操作,进一步提升了处理效率。 再者,索引可以优化JOIN操作。当两个或多个表进行JOIN操作时,...
综上所述,索引的存储结构与方式是数据库设计和优化的重要组成部分,理解并合理利用各种索引类型和存储策略,能够显著提升数据查询效率,为应用程序提供更好的性能体验。在实际工作中,数据库管理员和开发人员需要...
1. 如果列经常用于分组或排序,聚集索引可能更合适,因为它能直接返回有序数据。 2. 对于返回某范围内数据的操作,聚集索引可以快速定位起点和终点,提高效率。 3. 如果列值大部分相同,聚集索引的效果不佳,非聚集...
在索引页中,索引项存储了指向数据页中最小值的记录,索引页内部的数据页组成单向链表,且多索引页之间形成双向链表,以确保索引页的有序性。 全值匹配规则: 当使用全值匹配规则时,SQL查询语句中的where条件字段...
总结来说,基于块排序索引的生物序列局部比对查询技术是一种创新的解决方案,它旨在平衡生物序列比对的效率与准确性。通过优化索引结构,算法能够在减少内存消耗的同时,提高搜索速度,这对于处理当今生命科学研究中...
- **支持高效的数据排序:** 使用索引可以避免对大量数据进行临时排序,直接利用索引中的顺序获取有序结果。 - **优化查询计划:** 数据库优化器会根据索引来选择更高效的查询执行计划,进一步提升性能。 #### 二、...
- **使用索引情况**:相比之下,如果查询条件中包含的列已经创建了索引,MySQL可以直接利用索引快速定位到目标记录所在的物理位置,从而极大地提高了查询效率。 #### 二、索引的存储结构 所有MySQL索引均采用**B-...
堆排序是一种树形选择排序,利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。堆排序可以在O(n log n)的时间...
在数据库中,索引通常采用B树或B+树这样的数据结构,这使得索引能够保持有序性,便于进行范围查询和排序操作。例如,当我们在一个有大量记录的表中为某一列创建索引后,数据库系统可以通过二叉查找树等索引结构,以O...
此时,树型索引的优势就体现出来了——它们不仅能够保持数据的有序性,还能支持高效的范围查询,使得整体性能得到优化。 值得注意的是,MySQL的InnoDB存储引擎目前不支持哈希索引,这意味着在大多数情况下,我们...
本篇文章将深入探讨索引的实质及其在不同场景下的应用,旨在帮助用户更有效地利用索引来提升数据库操作的速度。 首先,我们需要理解索引的基本原理。在数据库中,索引就像书籍的目录,它提供了快速定位数据的能力。...
插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从序列中间插入一个元素时,为了保持已排序部分的有序性,需要将插入位置之后的元素整体后移。 **特点与应用:** - **时间...
- 无法用于范围查询,因为索引键在叶块中不是有序的。 **示例查询**: ```sql SELECT * FROM table_name WHERE column_name = value; ``` ##### 3. 降序索引 降序索引是在Oracle 8i版本中引入的一种新索引类型,...