索引的概念

  • 索引的概念

       1.索引是一种可选的与表相关的数据库对象,用于提高数据的查询效率。

       2.索引是一种有序的数据结构。

       3.如果一个表没有创建索引,则对该表进行查询时需要进行全表扫描;如果创建了索引,则在有条件查询时,系统先对索引进行查询,利用索引可以迅速查询到符合条件的数据。

       4.利用索引之所以能够提高查询效率,是因为在索引结构中保存了索引值及其相应记录的物理地址 ,即ROWID,并且按照索引值进行排序。当查询数据时,系统根据查询条件中的索引信息,利用特定的排序算法在索引结构中很快查询到相应的索引值及其对应 ROWID,根据ROWID可以在数据表中很快查询到符合条件的记录。如图所示:

  • ROWID 的概念与作用

       1.在Oracle数据库中,ROWIN 是一个伪列,系统自动产生,能唯一标识每一条数据库行记录的 物理地址 ,通过ROWIN能快速定位到一条行记录。

       2.ROWID由18位16进制数构成。其中前1-6位为数据对象编号,7-9位为数据文件编号,10-15数据块编号,最后 3位为块中行 编号。

       3.因为使用ROWID可以快速定位记录,所以使用ROWIN检索及操作数据,效率最快。

  • 索引分类

       1.根据索引值是否唯一,可分为唯一性索引 和 非唯一性索引

       2.根据索引的组织结构不同,可分为平衡数索引 和 位图索引

       3.根据索引基于的列数不同,可以分为单列索引 和 复合索引

  • 创建索引语法

       1.创建索引使用 create index 索引名称 on 表名

       2.创建非唯一性索引:create index 索引名 on 表名

       3.创建唯一性索引: create unique index 索引名 on 表名

       4.创建复合索引: create index 索引名 on user( username, userage)

  • 创建索引原则

       由于索引作为一个独立的数据库对象存在,占用存储空间,并且需要系统进行维护,因此是否创建索引和创建什么样的索引需要遵循一定的原则。下列情况下 ,适合创建索引:

          1.表中数据量很大

          2.要查询的结果占表中的数据的 2% - %4

          3.经常用来做where条件中的列或者多表连接的列

          4.查询列的数据范围分布很广

          5.查询列中包含大量的Null值,因为空值不包含在索引中

       下列情况不适合创建索引

          1.数据量很小的表

          2.在查询中不常用来作为查询条件的列

          3.频繁更新的表

          4.查询条件中有单行函数时,用不上索引

          5.索引列作为表达式的一部分被使用 时,比如查询的条件是 salary * 12,此时在 salary 列上创建索引是没有效果的。

  • 删除索引

       下面几种情况可以考虑删除索引:

          1.索引不在使用

          2.通过一段事件监视,发现几乎没有查询或只有少数查询会使用该索引。

          3.由于移动了表数据而导致索引失效。

       删除索引后,索引中的数据及定义被删除,索引所占的数据空间被释放,但表中的数据仍然存在 。

          1.如果索引是通过create index 语句创建的,可以使用drop index 语句删除索引,语法为: drop index 索引名

          2.如果索引是定义约束时自动建立的,则禁用约束或删除约束时会自动删除对应的索引。

          3.此外,删除表时会自动删除与其相关的所有索引。

  • 查询索引信息

       1.可以通过查询 数据字典视图 或 动态性能视图 获取索引信息。

       2.数据字典视图 USER_INDEXES 包含索引的基本描述信息和统计信息,包括索引的所有者 、索引名称、索引的类型 、对应表的名称等等。

       3.数据字典视图 USER_IND_COLUMNS 包含索引列的描述信息,包括索引的名称、表的名称和索引列的名称等信息。

       例:select* from USER_INDEXES

相关推荐
AIgorithmGEEK11 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表
数据库·mysql·b+树·索引
唠点键盘之外的13 小时前
26 向量数据库实战:从 0 搭一条能用的检索链路(pgvector + Spring AI)
数据库·人工智能·spring
云和恩墨14 小时前
数据库监控简史:监控不止于告警——从图表大爆发到健康管理闭环
数据库
ly768914 小时前
MongoDB 事务开销实测:快照隔离下的写冲突、重试与分片事务边界
数据库·mongodb·事务·分片集群·快照隔离·写冲突
豆角焖肉14 小时前
Spring AOP 自定义注解实现系统操作日志
数据库·自定义注解·springaop·操作日志·aop 切面
金伟API102415 小时前
不会写复杂SQL怎么办?
数据库·sql
执笔为剑15 小时前
2.1.2-1、V8R3迁移到V8R6-Oracle兼容特性
数据库
江湖有缘16 小时前
Docker实战 | 使用Docker部署rmoments社交平台
jvm·docker·oracle
geovindu16 小时前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
for_ever_love__16 小时前
MySQL SELECT 与 WHERE 优化实战:可搜索条件、联合索引与执行计划
数据库·mysql·oracle·select·where·条件优化·查询优化技巧