`

order by 使用索引的情况

阅读更多
order by 使用索引的情况
參考http://pub.itpub.net/post/26/2862?SelectActiveLayout=a
1)默认情况是按顺序先取rownum,再order by
2)如果order by 满足使用索引的情况,则先order by,再取rownum
order by 使用索引是有条件的:
1)ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
2)ORDER BY中所有的列必须定义为非空.
3)另外,如果ORDER BY中的列在where 条件中出现,也会使用索引

问题:
id为PK

select a,b,id from adf where rownum<7
A B ID
---------------------- ---------------------- ------
0 a 1
0 d 2
0 c 333
0 b 4
0 a 5
1 a 66
6 rows selected

select a,b,id from adf where rownum<7 order by id
A B ID
---------------------- ---------------------- ------
0 a 1
0 d 2
0 b 4
0 a 5
1 b 7
1 c 8
6 rows selected
结果是先order by ,再执行rownum<7

但如果是这样:
select a,b,id from adf where rownum<7 order by b
A B ID
---------------------- ---------------------- ------
0 a 1
0 a 5
1 a 66
0 b 4
0 c 333
0 d 2
6 rows selected
结果是先执行rownum<7,再order by

这是为什么???
难道是因为id是PK,所以就不同。

~~~~~~~~~~~~~~~~~~~~~~
解答:
跟主健及其上面的索引有关系:

ID是主健.

SQL> select * from t;

        ID        ID1
---------- ----------
         1          2
         2          4
         4          3


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (FULL) OF 'T'

SQL>  select * from t where rownum<3 order by id desc;

        ID        ID1
---------- ----------
         4          3
         2          4


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   COUNT (STOPKEY)
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'T'
   3    2       INDEX (FULL SCAN DESCENDING) OF 'PK' (UNIQUE)
'因为是主健,先进行索引的排序全表扫描,然后在 count 2'

SQL> select * from t where rownum<3 order by id1;

        ID        ID1
---------- ----------
         1          2
         2          4


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (ORDER BY)
   2    1     COUNT (STOPKEY)
   3    2       TABLE ACCESS (FULL) OF 'T'
'没有使用索引,先进行全表扫描,然后再count 2,再排序'

为什么会使用pk的索引呢?一般的索引行吗?
我们看看:

1)在id1上创建索引


SQL> create index id1idx on t(id1);

索引已创建。
SQL> select * from t where rownum<3 order by id1;

        ID        ID1
---------- ----------
         1          2
         2          4


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (ORDER BY)
   2    1     COUNT (STOPKEY)
   3    2       TABLE ACCESS (FULL) OF 'T'  '还是全表扫描'

SQL> select * from t where id1>0 and rownum<3 order by id1;
'加了id1>0 ,这样会使用到id1的索引'

        ID        ID1
---------- ----------
         1          2
         4          3


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   COUNT (STOPKEY)
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'T'
   3    2       INDEX (RANGE SCAN) OF 'ID1IDX' (NON-UNIQUE)


2)pk的索引是因为有order by 而使用的。order by 使用索引是有条件的:
ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
ORDER BY中所有的列必须定义为非空.

因为id1是可以为空的,所以order by 不会使用它。而pk的索引是非空的,所以order by 会使用。

我们将id1设为非空看看。


SQL> alter table t
  2  modify (id1 int not null);

表已更改。

SQL> select * from t where rownum<3 order by id1;

        ID        ID1
---------- ----------
         1          2
         4          3


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   COUNT (STOPKEY)
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'T'
   3    2       INDEX (FULL SCAN) OF 'ID1IDX' (NON-UNIQUE)
'这次,order by id1 使用了id1上的索引!'
分享到:
评论

相关推荐

    MySQL Order By索引优化方法

    以下是一些能够使用索引优化`ORDER BY`的例子: 1. 查询按索引完全顺序排列的数据: ```sql SELECT * FROM t1 ORDER BY key_part1, key_part2, ...; ``` 2. 当`WHERE`子句中包含索引的一部分,且`ORDER BY`按照...

    MYSQL order by排序与索引关系总结1

    反之,如果查询涉及的行数过多、使用了不同索引、索引列既有升序又有降序排列,或者WHERE和ORDER BY使用了不同索引,或者使用了列的表达式或函数,MySQL则可能使用FileSort。 例如,`SELECT * FROM friends WHERE ...

    MySQL 通过索引优化含ORDER BY的语句

    3. **使用`EXPLAIN`分析SQL性能**:通过`EXPLAIN`关键字,可以查看MySQL如何执行SQL语句,从而了解索引的使用情况和查询优化的可能性。 4. **避免无意义的索引**:在选择的列上创建索引不一定能优化查询,如在`...

    MySQL利用索引优化ORDER BY排序语句的方法

    创建表&创建索引 ...MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化 如果一个SQL语句形如: SELECT

    合理使用索引技巧

    - 经常需要进行排序或分组(如`GROUP BY`或`ORDER BY`)的列应建立索引,这样在执行这些操作时能减少数据排序的时间。 - 在条件表达式中出现频率高且具有较多不同值的列上创建索引,以减少全表扫描的次数。相反,...

    Oracle数据库中ORDER BY排序和查询按IN条件的顺序输出

    在描述中提到的问题中,当使用`ORDER BY`对包含非唯一值的列进行排序,并结合分页查询时,发现不同页码的数据可能会有重复。这进一步证实了`ORDER BY`在Oracle中的不稳定特性。在没有唯一索引或主键约束的情况下,...

    Sybase索引的使用和优化

    * 某列常用于 join,orderby,group by。 * 查寻出的数据不超过表中数据量的 20%。 三、覆盖索引(Covering Indexes) 覆盖索引是指那些索引项中包含查寻所需要的全部信息的非聚簇索引,这种索引之所以比较快也正是...

    数据库索引设计原则.

    1.3 ORDER BY 中用索引:在 ORDER BY 语句中使用索引,可以提高查询效率和性能。 1.4 索引列的类型:选择合适的索引列类型,例如 B-Tree 索引、位图索引、函数索引等,根据实际情况选择合适的索引类型。 1.5 WHERE...

    sybase索引的使用和优化

    例如,主键列、按范围存取的列、在 group by 或 order by 中使用的列是好的候选。避免在频繁修改或单调递增的列上建立聚簇索引,因为这可能导致频繁的行移动和锁定冲突。 2. 非聚簇索引 (Nonclustered Indexes) 非...

    75当我们在SQL里进行排序的时候,如何才能使用索引?.pdf

    5. 需要注意的是,在ORDER BY语句中混合使用ASC和DESC排序模式,或者在ORDER BY的字段中使用表达式,都会导致无法使用索引进行排序优化。因此,在设计数据库和编写查询语句时,应尽量避免这些情况。 总结来说,有效...

    76当我们在SQL里进行分组的时候,如何才能使用索引?.pdf

    此外,了解GROUP BY和ORDER BY操作使用索引的原理和条件也是相似的。在设计表的索引时,应该考虑到未来SQL查询的模式,包括哪些字段将用于过滤(WHERE子句)、排序(ORDER BY)以及分组(GROUP BY)。通过合理设计两...

    sql学习 索引特性之有序优化order by.sql

    sql学习 索引特性之有序优化order by.sql

    oracle索引,常见索引问题

    - **降序索引**:数据按照降序排列,有助于优化ORDER BY子句的反向排序查询。 - **反向键索引**:用于解决连续值导致的索引块竞争问题,通过字节反转使索引条目更均匀分布,减少热点块的出现。 2. **位图索引**:...

    Like-and-OrderBy.rar_sql like order by

    当你在查询中同时使用LIKE和ORDER BY时,LIKE通常是用于筛选数据,而ORDER BY则是为了确定返回结果的顺序。例如,如果你只关心以"J"开头且按名字降序排列的客户: ```sql SELECT * FROM Customers WHERE Name LIKE ...

    mysql order by limit 的一个坑.docx

    然而,在某些情况下,使用 ORDER BY 和 LIMIT 两个关键字可能会出现一些坑,今天我们就来讨论其中的一个坑。 问题的描述是这样的:当我们使用 ORDER BY 对某个字段进行排序,然后使用 LIMIT 限制返回的记录数时,...

    【mysql知识点整理】— order by 、group by 出现Using filesort原因详解

    - **特殊情况**:如果`WHERE`子句中`age`被设定为常量,例如`WHERE age = 10`,即使不直接使用`ORDER BY age`,MySQL仍然可以使用索引。 4. **会出现`Using filesort`的情况** 当`ORDER BY`的列不是索引的左前缀...

    mysql中提高Order by语句查询效率的两个思路分析

    因为可能需要对数据库的记录进行重新排序。在这篇文章中,笔者就谈谈提高Order By语句查询效率的两个...在条件允许的情况下,笔者建议最好使用一个索引来满足Order By子句。如此的话,就可以避免额外的排序工作。这里笔

    mysql高性能索引查询(查询性能问题、索引使用原则、索引创建、索引的优点缺点).docx

    - **加速排序**:对于ORDER BY等操作,索引可以帮助加速排序过程。 - **减少磁盘I/O操作**:索引可以减少磁盘I/O操作次数,提高查询速度。 ##### 2、索引的缺点 - **占用额外空间**:每个索引都需要占用一定的磁盘...

    覆盖索引及案例

    #### 三、使用Order by和distinct后,如何创建覆盖索引 1. **包含Order by操作时的覆盖索引**: - 当查询涉及`ORDER BY`时,被排序的字段应作为索引的一部分。这样可以避免额外的排序操作,从而提高查询性能。 - ...

Global site tag (gtag.js) - Google Analytics