http://www.itpub.net/thread-377823-1-1.html

前几天有过讨论。
我的建议就是尽量避免使用"%黄%",改为如下:
select ui."UID" ui_uid, uc.id uc_id, ui.cn
from um_userinfo ui, um_user_contact uc
where ui.cn like '黄%'
and uc.borrow_org is null
and ui."UID" = uc."UID"(+)
and ui.pafa_is_active = 'true';

当然这样也不一定会使用索引。因为姓黄的很多。最近我也遇到基本相似的问题,类似就是查询时使用%aaa%的问题,我的建议就是让开发人员改程序,而让操作人员决定是否输入百分号。

=============

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

一起jquery,17jquery

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

一起jquery,17jquery

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

内容来自17jquery

第一种情况 : 17jquery.com

一起jquery,17jquery

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

一起jquery,17jquery

一起jquery,17jquery

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

一起jquery,17jquery

内容来自17jquery

内容来自17jquery

第二种情况 :

17jquery.com
内容来自17jquery

order by的字段不在where条件但在select中。 内容来自17jquery

17jquery.com

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

17jquery.com

一起jquery,17jquery

内容来自17jquery

第三种情况 : 17jquery.com

内容来自17jquery

order by的字段在where条件但不在select中。 一起jquery,17jquery

内容来自17jquery

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

17jquery.com

一起jquery,17jquery
内容来自17jquery

内容来自17jquery

第四种情况 :

内容来自17jquery
17jquery.com

order by的字段在where条件但不在select中。倒序排列

内容来自17jquery

一起jquery,17jquery

select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc; 17jquery.com

内容来自17jquery

17jquery.com

内容来自17jquery

测试结果:

内容来自17jquery

内容来自17jquery

order by的字段不在where条件不在select中 有排序操作 17jquery.com

内容来自17jquery

order by的字段不在where条件但在select中 有排序操作 内容来自17jquery

内容来自17jquery

order by的字段在where条件但不在select中 无排序操作 17jquery.com

17jquery.com

order by的字段在where条件但不在select中(倒序) 无排序操作

17jquery.com

内容来自17jquery

结论:

17jquery.com

内容来自17jquery

当order by 字段出现在where条件中时,才会利用索引而无需排序操作。其他情况,order by不会出现排序操作。

17jquery.com
内容来自17jquery

分析: 一起jquery,17jquery

内容来自17jquery

为什么只有order by 字段出现在where条件中时,才会利用该字段的索引而避免排序。这要说到数据库如何取到我们需要的数据了。

17jquery.com

一条SQL实际上可以分为三步。 内容来自17jquery

1.得到数据

17jquery.com

17jquery.com

2.处理数据 内容来自17jquery

一起jquery,17jquery

3.返回处理后的数据

一起jquery,17jquery

17jquery.com

比如上面的这条语句select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc 内容来自17jquery

第一步:根据where条件和统计信息生成执行计划,得到数据。

内容来自17jquery
内容来自17jquery

第二步:将得到的数据排序。

17jquery.com

内容来自17jquery

当执行处理数据(order by)时,数据库会先查看第一步的执行计划,看order by 的字段是否在执行计划中利用了索引。如果是,则可以利用索引顺序而直接取得已经排好序的数据。如果不是,则排序操作。 内容来自17jquery

内容来自17jquery

第三步:返回排序后的数据。 一起jquery,17jquery

17jquery.com

另外:

内容来自17jquery

一起jquery,17jquery

上面的5万的数据sort只用了25ms,也许大家觉得sort不怎么占用资源。可是,由于上面的表的数据是有序的,所以排序花费的时间较少。如果是个比较无序的表,sort时间就会增加很多了。另外排序操作一般都是在内存里进行的,对于数据库来说是一种CPU的消耗,由于现在CPU的性能增强,对于普通的几十条或上百条记录排序对系统的影响也不会很大。但是当你的记录集增加到上百万条以上时,你需要注意是否一定要这么做了,大记录集排序不仅增加了 CPU开销,而且可能会由于内存不足发生硬盘排序的现象,当发生硬盘排序时性能会急剧下降。

17jquery.com

内容来自17jquery

注:ORACLE或者DB2都有一个空间来供SORT操作使用(上面所说的内存排序),如ORACLE中是用户全局区(UGA),里面有SORT_AREA_SIZE等参数的设置。如果当排序的数据量大时,就会出现排序溢出(硬盘排序),这时的性能就会降低很多了。

17jquery.com

内容来自17jquery

总结: 一起jquery,17jquery

一起jquery,17jquery

当order by 中的字段出现在where条件中时,才会利用索引而不排序,更准确的说,order by 中的字段在执行计划中利用了索引时,不用排序操作。 一起jquery,17jquery

17jquery.com

这个结论不仅对order by有效,对其他需要排序的操作也有效。比如group by 、union 、distinct等。

like ,order 使用索引相关推荐

  1. order by 索引

    2019独角兽企业重金招聘Python工程师标准>>> 一个容易被忽略的SQL调优技巧 --- order by字段到底要不要加入索引 字数 3507阅读 1275评论 1赞 2 作 ...

  2. MySql ORDER BY 索引优化

    上一篇:MySql 索引优化 MySql 支持两种方式的排序,FileSort 和 Index ,Index 效率高,它指的是 MySql 扫描索引本身完成排序.FileSort 会对数据使用一个外部 ...

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

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

  4. mysql+order+in索引吗_mysql – 为什么ORDER BY不使用索引?

    这是我的表格: CREATE TABLE `person` ( `id` bigint(10) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT ...

  5. MySQL高级- group by ,order by 索引优化

    一:索引失效 1. 2.最佳左前缀法则 4. 8. 使用覆盖索引解决这个问题. 二.索引优化 1.ORDER BY 子句,尽量使用Index方式排序,避免使用FileSort方式排序 MySQL支持两 ...

  6. oracle order by 走索引吗,oracle order by 索引是否使用的情况

    刚开始在网上看了很多说order by 走索引有两个前提条件 1,ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. 2,ORDER BY中所有的列必须定义为非空. 下面是测试 ...

  7. mysql order 走索引么_mysq order by 不走索引问题

    问题描述 今天遇到一个问题,在一个报表导出的功能中,需要导出用户的某些记录的所有数据,有些用户有多达10万的记录,导出过程非常慢,需要10多秒.经过排查,发现是查询数据库的时候的问题,查询数据居然用了 ...

  8. SAP CRM One Order关于索引表CRMD_ORDER_INDEX的一些性能问题的分析

    From: Wang, Jerry Sent: Wednesday, March 19, 2014 11:54 AM Subject: FW: custom development in IC sea ...

  9. order by、group by也会使用索引?使用这俩关键字的时候索引什么时间会失效

    目录 写在前面 初始化语句 order by索引分析 总结 group by 写在前面 我们都知道,索引可以提高查询和排序的速度. 所以,order by做排序的时候,显然是可以使用索引的. grou ...

最新文章

  1. MyBatis动态SQL(认真看看, 以后写SQL就爽多了)
  2. redis性能测试报告
  3. Protocol Buffer C++应用实例
  4. 一点MATLAB程序加速技巧
  5. IT牛人往事如烟之七大“先烈”
  6. screen常用命令以及screen恢复会话时出现There is no screen to be resumed matching
  7. webmagic 获取文本_学习使用Java的webmagic框架爬取网页内容
  8. pg日期转周_postgresql 存储过程函数:时间戳与日期字符串相互转换
  9. JavaScript中“javascript:void(0) ”是什么意思
  10. 2013蓝桥杯-B-省赛-六-三部排序
  11. Visual Studio Code 1.51 发布
  12. Intellij IDEA 2017 如何导入 GitHub 中的项目
  13. M文件---脚本与函数
  14. 人脸及脸部关键点检测控件
  15. 基于jsp+mysql+Spring+SpringMVC+mybatis的大学生缴费系统-计算机毕业设计
  16. Linux邮件自动转发,Postfix 利用用户别名自动转发邮件
  17. Neo4j导入本地CSV文件三元组关系生成图谱
  18. j3455linux网卡不亮,J3455 ProxmoxVE v6.0-4 直通物理网卡教程
  19. 面向对象编程(OOP)面向对象编程(OOP)
  20. sip测试工具--Sipp的编译

热门文章

  1. MFC 基础知识:对话框背景添加图片和按钮Button添加图片
  2. Python之打造专属Python开发者的完美终端工具Rich
  3. 【数据结构与算法】之旋转图像的求解算法
  4. 2015年第六届蓝桥杯 - 省赛 - C/C++大学C组 - A. 隔行变色
  5. 297. Serialize and Deserialize Binary Tree
  6. Spring Boot(二)应用实例
  7. 【工业控制】激光跟踪仪概述
  8. 【Linux】一步一步学Linux——readonly命令(219)
  9. 【Linux】一步一步学Linux——ethtool命令(155)
  10. 【C++】 C++字符串类