`

sql order by与索引之间的关系(where条件出现字段才有效)

    博客分类:
  • sql
 
阅读更多
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等。
  • 大小: 16 KB
  • 大小: 16 KB
  • 大小: 20.6 KB
  • 大小: 21 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    【MySQL】经验:索引使用场景

    一、适合用索引的场景 ...这里要注意,order by的字段出现在where条件中才能使用索引,否则索引失效。 5、查询中的统计、分组字段 group by和union也属于需要排序的操作,这里也要注意字段出现在whe

    presto sql 与mysql sql 对比.pdf

    例如,在 MySQL SQL 中,`where` 条件中的字符串类型可以隐式转换为数字类型,但这可能会造成索引不起效和非预期的结果。 聚合函数 Presto SQL 和 MySQL SQL 都支持聚合函数,如 `count()`、`sum()`、`avg()` 等。...

    提高SQL处理查询上百万条数据库的速度

    1. 对查询进行优化,尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 在优化查询时,避免全表扫描是非常重要的。全表扫描会使查询速度变得很慢,因为它需要遍历整个表。通过建立索引,可以...

    Access采用sql语句与sql的区别

    Access 采用 SQL 语句与 SQL 的区别 在讨论 Access 采用 SQL 语句与 SQL 的区别之前,我们需要了解 Access 和 SQL Server 的基本概念。Access 是一个桌面数据库管理系统,而 SQL Server 是一个关系数据库管理系统。...

    在sql中不指定Order by排序是按照主键吗

    在sql中不指定Order by,排序是按照主键吗?...所以得出结论:在不指定Order by的情况下,sqlserver会根据执行计划实际查询方式来得到数据,而执行计划会根据sql中很多的因素(的查询列,where条件,order

    SQL_Server_2000常用命令,语法使用方法

    * `SELECT * FROM 数据表 WHERE 字段名 LIKE '%字段值%' ORDER BY 字段名 [DESC]` * `SELECT TOP 10 * FROM 数据表 WHERE 字段名 ORDER BY 字段名 [DESC]` * `SELECT * FROM 数据表 WHERE 字段名 IN ('值 1', '值 2'...

    经典SQL语句大全

    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 具体实现: 关于数据库分页: declare @start int,@...

    MYSQL常用命令大全

    7、修改表中数据:update 表名 set 字段=新值,… where 条件 mysql&gt; update MyClass set name='Mary' where id=1; 7、在表中增加字段: 命令:alter table 表名 add字段 类型 其他; 例如:在表MyClass中添加了一个...

    SQL21日自学通

    静态SQL 与动态SQL277 使用SQL 来编程279 总结280 问与答280 校练场280 练习281 第14 天动态使用SQL 282 目标282 快速入门282 ODBC 282 Personal Oracle 7283 InterBase SQL ISQL 283 Visual C++ 284 Delphi284 设置...

    经典全面的SQL语句大全

    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段  14、说明:前10条记录 select top 10 * form table1 ...

    SQL培训第一期

    1 SQL基础 1.1 基本概念 结构化查询语言(Structured Query ...select后面出现的列,如果没有使用集合函数,必须出现在group by 中。 select sno,sname,sum(grade) from student group by sno,sname; //合法写法 select...

    orcale常用命令

    SQL&gt;select index_name,index_type,table_name from user_indexes order by table_name; 查看索引被索引的字段 SQL&gt;select * from user_ind_columns where index_name=upper('&index_name'); 查看索引的大小 ...

    精通SQL--结构化查询语言详解

    第1章 数据库与sql基础 1 1.1 数据库的基本概念 1 1.1.1 数据库的由来 1 1.1.2 数据库系统的概念 3 1.2 数据库系统的结构、组成及工作流程 3 1.2.1 数据库的体系结构 3 1.2.2 数据库系统的组成 4 1.2.3 ...

    程序员的SQL金典.rar

     10.7.3 ORDER BY子句  10.7.4 高级开窗函数  10.8 WITH子句与子查询 第11章 案例讲解  11.1 报表制作  11.1.1 显示制单人详细信息  11.1.2 显示销售单的详细信息  11.1.3 计算收益  11.1.4 产品销售额统计 ...

    2009达内SQL学习笔记

    NOT 与 IN 在一起使用时,NOT 是找出与条件列表不匹配的行。 IN 列表里有 NULL 时不处理,不影响结果;用 NOT IN 时,有 NULL 则出错,必须排除空值再运算。 in :选择列表的条件 使用IN操作符的优点: 在长的...

    程序员的SQL金典4-8

     10.7.3 ORDER BY子句  10.7.4 高级开窗函数  10.8 WITH子句与子查询 第11章 案例讲解  11.1 报表制作  11.1.1 显示制单人详细信息  11.1.2 显示销售单的详细信息  11.1.3 计算收益  11.1.4 产品销售额统计 ...

    sql经典语句一部分

    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 具体实现: 关于数据库分页: declare @start int,@...

    SQL查询安全性及性能优化

     order by 后跟的字段尽量是索引字段,如果这个字段不是索引字段可以考虑时候可以给这个排序字段加上索引 使用存储过程优化 复杂的业务逻辑可以使用存储过程来实现 优点: 减少网络流量--将多种操作放在一个过程...

    数据库操作语句大全(sql)

    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 具体实现: 关于数据库分页: declare @start int,@...

Global site tag (gtag.js) - Google Analytics