索引的概念

  • 索引的概念

    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

相关推荐
月光水岸New9 分钟前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山67510 分钟前
数据库基础1
数据库
我爱松子鱼14 分钟前
mysql之规则优化器RBO
数据库·mysql
chengooooooo39 分钟前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser2 小时前
【SQL】多表查询案例
数据库·sql
Galeoto2 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)2 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231112 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白2 小时前
PostgreSQL:更新字段慢
数据库·postgresql
敲敲敲-敲代码2 小时前
【SQL实验】触发器
数据库·笔记·sql