mysql 索引范围扫描_索引范围扫描(INDEX RANGE SCAN)

本文详细介绍了MySQL中的索引范围扫描(INDEX RANGE SCAN),包括唯一性和非唯一性索引的情况。通过实例展示了如何在不同查询条件下使用范围扫描,并解释了其在不同排序需求下的执行计划差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

索引范围扫描(INDEX RANGE SCAN)适用于所有类型的B树索引,当扫描的对象是唯一性索引时,此时目标SQL的where条件一定是范围查询(谓词条件为 BETWEEN、等);当扫描的对象是非唯一性索引时,对目标SQL的where条件没有限制(可以是等值查询,也可以是范围查询)。 索引范围扫描的结果可能会返回多条记录,其实这就是索引范围扫描中"范围"二字的本质含义。

测试一:唯一索引的范围查询

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

SCOTT@PDBORCL> select * from emp where empno>7369;

已选择13行。

执行计划----------------------------------------------------------

Plan hash value: 2787773736

----------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

----------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 13 | 494 | 2 (0)| 00:00:01 |

| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| EMP | 13 | 494 | 2 (0)| 00:00:01 |

|* 2 | INDEX RANGE SCAN | PK_EMP | 13 | | 1 (0)| 00:00:01 |

----------------------------------------------------------------------------------------------

Predicate Information (identifiedbyoperation id):---------------------------------------------------

2 - access("EMPNO">7369)

统计信息----------------------------------------------------------

54recursive calls0db block gets97consistent gets21physical reads0redo size1607 bytes sent via SQL*Net toclient544 bytes received via SQL*Net fromclient2 SQL*Net roundtrips to/fromclient8sorts (memory)0 sorts (disk)13rows processed

SCOTT@PDBORCL>

View Code

9cfdb719df3cee7f24b7d69479aeb7a1.png

SCOTT@PDBORCL>  select * from emp where empno>7369 order by empno desc; (降序排列)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

SCOTT@PDBORCL> select * from emp where empno>7369 order by empno desc;

已选择13行。

执行计划----------------------------------------------------------

Plan hash value: 2707196548

---------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

---------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 13 | 494 | 2 (0)| 00:00:01 |

| 1 | TABLE ACCESS BY INDEX ROWID | EMP | 13 | 494 | 2 (0)| 00:00:01 |

|* 2 | INDEX RANGE SCAN DESCENDING| PK_EMP | 13 | | 1 (0)| 00:00:01 |

---------------------------------------------------------------------------------------

Predicate Information (identifiedbyoperation id):---------------------------------------------------

2 - access("EMPNO">7369)

统计信息----------------------------------------------------------

54recursive calls0db block gets97consistent gets21physical reads0redo size1607 bytes sent via SQL*Net toclient544 bytes received via SQL*Net fromclient2 SQL*Net roundtrips to/fromclient8sorts (memory)0 sorts (disk)13rows processed

SCOTT@PDBORCL>

View Code

8f9VhuG123F0tAAAAAElFTkSuQmCC

这个执行计划和上面的执行计划有什么区别呢?其中第一个执行计划是索引范围扫描(INDEX RANGE SCAN),但是第二个执行计划是索引范围降序扫描(INDEX RANGE SCAN DESCENDING)。由此可以看出对于唯一索引,ORACLE是已经进行了正序排列了。也就是唯一索引在进行排序的时候消耗不是很大的,因为它在保存 的时候就按照升序进行保存的。

测试二:非唯一索引的等值查询

创建一个测试表EMP_TEMP:

create table emp_temp as select * from emp;

然后在表EMP_TEMP的列EMPNO上创建一个单键值非唯一性同名B树索引IDX_EMP_TEMP:

create index idx_emp_temp on emp_temp(empno);

最后我们再次执行如下SQL:

select * from emp_temp where empno=7369;

执行计划如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

SCOTT@PDBORCL> create table emp_temp as select * fromemp;

表已创建。

SCOTT@PDBORCL> create index idx_emp_temp onemp_temp(empno);

索引已创建。

SCOTT@PDBORCL> select * from emp_temp where empno=7369;

执行计划----------------------------------------------------------

Plan hash value: 1638992559

----------------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

----------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 38 | 2 (0)| 00:00:01 |

| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| EMP_TEMP | 1 | 38 | 2 (0)| 00:00:01 |

|* 2 | INDEX RANGE SCAN | IDX_EMP_TEMP | 1 | | 1 (0)| 00:00:01 |

----------------------------------------------------------------------------------------------------

Predicate Information (identifiedbyoperation id):---------------------------------------------------

2 - access("EMPNO"=7369)

统计信息----------------------------------------------------------

46recursive calls0db block gets76consistent gets16physical reads0redo size1042 bytes sent via SQL*Net toclient544 bytes received via SQL*Net fromclient2 SQL*Net roundtrips to/fromclient6sorts (memory)0 sorts (disk)1rows processed

SCOTT@PDBORCL>

View Code

d7f1731a37475f1806a876b2e50a787c.png

此SQL的执行计划已经从之前的索引唯一性扫描变为现在的索引范围扫描

测试三:非唯一索引的范围查询

同样是测试二中的表EMP_TEMP

SCOTT@PDBORCL> select * from emp_temp where empno>7369;

执行计划如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

SCOTT@PDBORCL> select * from emp_temp where empno>7369;

已选择13行。

执行计划----------------------------------------------------------

Plan hash value: 1638992559

----------------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

----------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 13 | 494 | 2 (0)| 00:00:01 |

| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| EMP_TEMP | 13 | 494 | 2 (0)| 00:00:01 |

|* 2 | INDEX RANGE SCAN | IDX_EMP_TEMP | 13 | | 1 (0)| 00:00:01 |

----------------------------------------------------------------------------------------------------

Predicate Information (identifiedbyoperation id):---------------------------------------------------

2 - access("EMPNO">7369)

统计信息----------------------------------------------------------

46recursive calls0db block gets77consistent gets15physical reads0redo size1607 bytes sent via SQL*Net toclient544 bytes received via SQL*Net fromclient2 SQL*Net roundtrips to/fromclient6sorts (memory)0 sorts (disk)13rows processed

SCOTT@PDBORCL>

View Code

803c209ce411e9d2a619a9eaf7994566.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值