order by与索引

2023-10-29

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等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

order by与索引 的相关文章

随机推荐

  • MacOSX上的NFS文件共享

    在MacOSX上接触过rsync方式文件共享和NFS方式文件共享 两种方式的基本使用方式如下 1 rsync方式 这种方式和scp用法很像 rsync file1 user host xx file2 如果传输目录 需要加一个 a参数 如果
  • web 3d场景构建+three.js+室内围墙,仓库,楼梯,货架模型等,第一人称进入场景案例

    翻到了之前的一个案例 基于three js做的仓库布局模拟 地图元素除了大模型外 其他都是通过JSON数据解析动态生成的 例如墙体 柱子门口 地标等 集成了第一人称的插件可以第一人称进入场景有需要的可以下载看看 对想入门的朋友应该有一些参考
  • C# winform之属性 bindingNavigator

    适用于 BindingNavigator控件主要用来绑定数据 可以将一个数据集合与该控件绑定 以进行数据 联动的显示效果 类似于表格显示信息 详细参考 http www cnblogs com qq260250932 p 5507410 h
  • matlab特征提取和分类_SAST Weekly

    SAST weekly 是由电子工程系学生科协推出的科技系列推送 内容涵盖信息领域技术科普 研究前沿热点介绍 科技新闻跟进探索等多个方面 帮助同学们增长姿势 开拓眼界 每周更新 欢迎关注 欢迎愿意分享知识的同学投稿至 eesast mail
  • VR桥梁应用:实现可视化的桥梁监控

    在过去的几年中 虚拟现实 VR 技术已经在多个领域得到了广泛的应用 其中 桥梁巡检是一个特别有前景的应用领域 利用VR技术 我们可以创建一个安全 高效的桥梁巡检方式 帮助工程师和维护人员更好地理解和评估桥梁的状态 通过VR设备 用户可以全方
  • java线程间通讯的几种方式

    文章目录 一 使用同一个共享变量控制 Synchronized wait notify Lock Condition 利用volatile 利用AtomicInteger 二 PipedInputStream PipedOutputStre
  • 108.将有序数组转换为二叉搜索树

    108 将有序数组转换为二叉搜索树 题干描述 解题思路 递归 1 确定递归函数返回值及其参数 2 确定单层递归的逻辑 迭代法 总结 代码实现 递归法 左闭右开 递归法 左闭右闭 迭代法 题干描述 力扣入口 将一个按照升序排列的有序数组 转换
  • ob集群安装部署相关

    一 黑屏 命令行 模式安装ob三节点集群 1 主机规划 主机名 ip 内存 G cpu 安装软件 占用端口 mgr1 172 16 80 57 128 32 observer zone1 obclient obproxy 2881 2882
  • 专科程序员与本科程序员之间有什么区别?

    专科程序员和本科程序员之间最主要的区别在于他们的学历水平以及所接受的教育和培训的深度和广度不同 本科程序员通常拥有更为全面的计算机技术理论知识 同时也接受了更加系统和广泛的相关课程和实践 比如算法 计算机网络 操作系统 软件工程等等 他们研
  • Unity中3D物体添加点击事件

    简单十步曲 按步骤操作可实现对应功能 1 创建摄像机Camera Tag修改Main Camera 2 给Camera添加组件PhysicsRaycaster 3 创建一个空物体 命名EventSystem 4 给刚创建EventSyste
  • vba 获取最后一行

    mainWs Cells mainWs Rows Count 1 End xlUp row
  • FaceNet--Google的人脸识别(转)

    原文地址 http blog csdn net stdcoutzyx article details 46687471 引入 随着深度学习的出现 CV领域突破很多 甚至掀起了一股CV界的创业浪潮 当次风口浪尖之时 Google岂能缺席 特贡
  • 构建安全的数据访问-配置管理(六)

    数据库连接字符串是针对数据访问代码主要考虑的配置管理问题 应认真考虑这些字符串的存储位置以及如何保护它们 特别是当它们包括凭据时 要提高加密管理安全性 使用 Windows 身份验证 确保连接字符串的安全 使用受限制的 ACL 确保 UDL
  • 【内网提权】windows2003本地PR提权详解

    提权利用的漏洞 Microsoft Windows RPCSS服务隔离本地权限提升漏洞 RPCSS服务没有正确地隔离 NetworkService 或 LocalService 帐号下运行的进程 本地攻击者可以利用令牌劫持的方式获得权限提升
  • 项目回顾:一个简单的充值码库存管理系统

    这里写目录标题 背景 需求 第一步 从商家获取充值码 第二步 需要能在平台上售卖充值码 第三步 后台管理系统 实现 防止重复售卖 重复发货 防止超售 邮件系统 性能 小结 背景 回顾一下去年 6 月左右做的一个库存管理系统 需求 我们是做一
  • 各种开源协议

    来源 玩转嵌入式 今天跟大家分享一些开源协议的知识 这些协议缩写词在各种代码 文档中随处可见 可又有多少人对这些知识细细研究过呢 作为一名专业的嵌入式系统开发人员这些东西都是一种素养 特别是当你自己要开源一些东西的时候该如何选择开源协议就变
  • 一个移植十分方便的malloc函数族的实现

    相信学习过c语言的人都知道malloc free函数 这里就不多说怎么用了 这里要说的是 提供它们的实现 该实现方法由uboot中malloc等函数的实现改编而来 已经过验证 没有问题 多说一句 该实现支持物理地址malloc free 不
  • Vue 使用 Markdown标记语言编辑器(MavonEditor)

    文章目录 1 实现效果 2 直接撸 MavonEditor 上代码 2 1 npm安装 MavonEditor 2 2 在需要使用Markdown的Vue组件导入mavonEditor 2 3 vue页面使用 3 参考 1 实现效果 本篇文
  • 7-10倍写入性能提升:剖析WiredTiger数据页无锁及压缩黑科技

    导语 计算机硬件在飞速发展 数据规模在急速膨胀 但是数据库仍然使用是十年以前的架构体系 WiredTiger 尝试打破这一切 充分利用多核与大内存时代来重新设计数据库引擎 达到 7 10 倍写入性能提升 本文由袁荣喜向 高可用架构 投稿 通
  • order by与索引

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