ORDER BY 通常会有两种实现方法,一个是利用有序索引自动实现,也就是说利用有序索引的有序性就不再另做排序操作了。另一个是把结果选好之后再排序。

用有序索引这种,当然是最快的,不过有一些限制条件,来看下面的测试。

测试数据:student表有两个字段id ,sid ,id是主键。一共有20W条记录,id从1到200000,sid也是从1到200000的数据。

第一种情况 :

order by的字段不在where条件也不在select中

select sid from zhuyuehua.student where sid < 50000 order by id;

第二种情况 :

order by的字段不在where条件但在select中。

select id,sid from zhuyuehua.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 zhuyuehua.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 zhuyuehua.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等。

转载于:https://www.cnblogs.com/yelongsan/p/10272263.html

db2 order by 利用索引相关推荐

  1. mysql key value 排序_MySQL利用索引优化ORDER BY排序语句的方法

    创建表&创建索引 create table tbl1 ( id int unique, sname varchar(50), index tbl1_index_sname(sname desc ...

  2. MySQL如何利用索引优化ORDER BY排序语句

    MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...

  3. mysql order by 索引名字_MySQL如何利用索引优化ORDER BY排序语句

    MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...

  4. order by与索引

    ORDER BY 通常会有两种实现方法,一个是利用有序索引自动实现,也就是说利用有序索引的有序性就不再另做排序操作了.另一个是把结果选好之后再排序. 用有序索引这种,当然是最快的,不过有一些限制条件, ...

  5. mysql索引排序算法_MySQL中利用索引对数据进行排序的基础教程

    MySQL中,有两种方式生成有序结果集:一是使用filesort,二是按索引顺序扫描.利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作.当索引的顺序与ORDER BY中的列顺 ...

  6. mysql调试索引_10 分钟让你明白 MySQL 是如何利用索引的?

    一.前言 在 MySQL 中进行 SQL 优化的时候,经常会在一些情况下,对 MySQL 能否利用索引有一些迷惑. 譬如: MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件? ...

  7. mysql中groupby会用到索引吗_mysql order by 与索引的使用

    测试数据表 user_group 表结构: id int(10) primarey key auto_increment user_id int(10) (唯一) group_id mediumint ...

  8. SQL group by底层原理——本质是排序,可以利用索引事先排好序

    转自:http://blog.csdn.net/caomiao2006/article/details/52140993 由于GROUP BY 实际上也同样会进行排序操作,而且与ORDER BY 相比 ...

  9. mysql between and 包含边界吗_10分钟让你明白MySQL是如何利用索引的

    一.前言 在MySQL中进行SQL优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑. 譬如: MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件? MySQL ...

最新文章

  1. 转载LINQ优点 自己学习用的
  2. 【oracle】dblink创建
  3. java-简单计算器窗口
  4. 解密Kernel:为什么适用任何机器学习算法?
  5. web开发的跨域问题详解
  6. odoo pivot中去掉求和_一文读懂深度学习中的卷积运算与图像处理
  7. weblogic12.1.3安装
  8. pytorch数据预处理
  9. matlab进行特征缩放,机器学习中(Feature Scaling)特征缩放处理的matlab实现方式
  10. 虚继承 - C++快速入门29
  11. 2.Zabbix企业级分布式监控系统 --- Zabbix 简介
  12. mac 版 SourceTree(git 客户端)跳过登录验证
  13. jq-ui的Sortable插件 两列布局 左右拖拽
  14. 对《致加西亚的信》的异议
  15. 使用Kuboard spray部署Kubernetes 1.24.3 集成Harbor私有镜像库
  16. 残差分析三要素(补充说明OLS六个条件与残差季节性)
  17. 修改并完善框架协议、合同的类型、有效期及目标值等
  18. 网站中的PV是什么意思?
  19. 恐怖系列丨互联网幕后攻防:咳血的独角兽之血腥丛林中的无底线战争
  20. 设计模式----工厂

热门文章

  1. oracle SQL 命令行(三.增删改查)
  2. python怎样给对象赋值_Python对象赋值、浅拷贝和深拷贝
  3. vue hot true 不起作用_从源码解读 Vuex 注入 Vue 生命周期的过程
  4. linux下C语言套接字编程sockaddr和sockaddr_in的区别
  5. 武汉网络推广优化中网站关键词如何更合理布局分布?
  6. 网站关键词优化如何控制其密度?
  7. docker新增目录映射_开发也需了解的运维知识之Docker
  8. 动网 php v1.0 漏洞,动网(DVBBS)PHP论坛preview.php代码执行漏洞
  9. 在arm linux mini2440上移植ntp服务,RTEMS 4.9.5 在 QEMU MINI2440 上的移植发布啦……
  10. 无损压缩算法历史——熵编码是最早出现的,后来才有Lzx这些压缩算法