数据库系统是目前国际上流行的关系数据库管理系统。 该系统移植性好,使用方便,功能强大,适用于各种大、中、小型计算机环境。 在关系数据库中,索引是一种独立的物理存储结构,用于对数据库表中一个或多个列的值进行排序。 指向数据页的逻辑指针列表,这些值在其中进行物理标识。 索引的作用相当于书籍的目录。 您可以根据目录中的页码快速找到所需的内容,可以有效帮助数据库提高效率。 索引的效率在数据库中得到了广泛的应用。
1、特点和优点: 提高效率 主键唯一性验证成本: 需要空间存储来定期维护和重建索引:
LTER INDEX REBUILD
2.索引的访问方式有两种
索引扫描(Index Scan)
索引范围扫描
3、基本表的选择
基表(Table)是指最先访问的表(通常通过全表扫描访问)。 根据优化器的不同,SQL语句中底层表的选择也不同。
如果使用CBO(COST baseD),优化器会检查SQL语句中每个表的物理大小、索引的状态,然后选择成本最低的执行路径。
如果使用 RBO (RULE baseD ),并且所有连接条件都有对应的索引,在这种情况下,基表是 FROM 子句中列出的最后一个表。
4. 多个相等索引
当SQL语句的执行路径可以使用分布在多个表上的多个索引时,会同时使用多个索引,并在运行时合并它们的记录,以仅检索对所有索引有效的记录。
在选择执行路径时,唯一索引的排名高于非唯一索引。 但是,此规则仅在将索引列与 WHERE 子句中的常量进行比较时才有效。 如果索引列与其他表的索引类进行比较。 此类子句在优化器中的排名非常低。
如果要引用不同表上的两个相同级别的索引,则 FROM 子句中表的顺序将决定先使用哪个索引。 FROM 子句中最后一个表的索引将具有最高优先级。
如果要引用同一个表上的两个相同级别的索引,则 WHERE 子句中最先引用的索引将具有最高优先级。
5. 相等比较优先于范围比较。 有非唯一索引,也有非唯一索引。
SELECT ENAME FROM EMPWHERE DEPTNO > 20AND EMP_CAT = 'A'
这里只使用索引,然后将所有记录与条件一一进行比较。 执行路径如下:
TABLE ACCESS BY ROWID ON EMPINDEX RANGE SCAN ON CAT_IDX
即使是唯一索引,如果做范围比较,其优先级也低于非唯一索引的相等比较。
6.索引级别不明确当无法判断索引的级别差异时,优化器将只使用一个索引,该索引在WHERE子句中列在第一位。 上有一个非唯一索引, 上有一个非唯一索引。
SELECT ENAME FROM EMPWHERE DEPTNO > 20AND EMP_CAT > 'A'
这里,仅使用索引。 执行路径如下:
EMP 上的 ROWID 表
索引范围扫描开启
7、强制索引失败 如果两个或多个索引具有相同的级别,可以强制优化器使用其中之一(通过它,检索到的记录数很少)。
SELECT ENAMEFROM EMPWHERE EMPNO = 7935AND DEPTNO + 0 = 10 AND EMP_TYPE || '' = 'A'
8. 如果索引列是函数的一部分,请避免在索引列上使用计算的 WHERE 子句。 优化器不会使用索引,而是使用全表扫描。
SELECT * FROM DEPTWHERE SAL * 12 > 25000;
SELECT * FROM DEPTWHERE SAL > 25000/12;
9、自动选择索引 如果表中有两个以上(含两个)索引,则其中一个为唯一索引,其他为非唯一索引。 在这种情况下,将使用唯一索引,并且完全忽略非唯一索引。
SELECT ENAME FROM EMP WHERE EMPNO = 2326AND DEPTNO = 20;
这里,只有 EMPNO 上的索引是唯一的,因此 EMPNO 索引将用于检索记录。
SELECT ENAME FROM EMP WHERE EMPNO = 2326AND DEPTNO = 20;
10. 避免在索引列上使用 NOT 通常,我们希望避免在索引列上使用 NOT,NOT 会产生与在索引列上使用函数相同的影响。 当遇到 NOT 时,它会停止使用索引并执行全表扫描。
SELECT * FROM DEPTWHERE NOT DEPT_CODE = 0
SELECT * FROM DEPTWHERE DEPT_CODE > 0
当我们学习如何使用索引来提高数据库的效率时,有很多细节需要注意,以避免不必要的工作量。 在本站的教程中,针对索引的各种应用给出了具体案例。 结合案例让我们更容易理解索引的使用。