索引

44 阅读2分钟

[TOC]

索引

索引应当创建在 常查少改 的基础上创建。

rowid

rowid 是一个伪列系统自动产生,系统自动产生。

ROWID能唯一标示每一条数据库行记录的物理地址,通过 ROWID 能快速定位到一条行记录。

创建索引

  • 自动创建: 当有PRIMARY KEY 或者UNIQUE 约束时,数据库会自动创建一个索引;
  • 手动创建: 用户使用创建索引语法来进行创建;
CREATE [ UNIQUE|BITMAP] index 索引名称
ON 表名 (列名1 ASC|DESC, 表达式 ASC|DESC,…) [REVERSE];

# 建议索引命名格式:idx_表名_列名

适合创建索引情况

  • 表数据量很大
  • 要查询的结果集在2%-4%左右
  • 经常用来做WHERE条件中的列或者多表连接的列
  • 查询列的数据范围分布很广
  • 查询列中包含大量的NULL值因为空值不包含在索引中

不适合创建索引情况

  • 数据量很小的表
  • 在查询中不常用来作为查询条件的列
  • 频繁更新的表
  • 索引列作为表达式的一部分被使用时,比如常查 询的条件是SALARY*12,此时在SALARY列上创建索引是没有效果的
  • 查询条件中有单行函数时,用不上索引 查询条件中有单行函数时,用不上索引

索引缺点

  • 占用空间;
  • 降低DML的操作速度;

删除索引

drop index 索引名;

相关数据字典

USER_INDEXES 数据字典视图包含索引的名称及其唯一性;

USER_IND_COLUMNS 数据字典视图包含索引名称、表名以及列名;

示例:

# 创建索引
CREATE UNIQUE INDEX adopt_time_index ON pet(adopt_time DESC);
CREATE BITMAP INDEX type_id_bitmap_index ON pet(type_id);
CREATE INDEX health_love_index ON pet(health,love);
CREATE INDEX to_char_index ON pet(TO_CHAR(adopt_time,'YYYY'));
CREATE INDEX master_id_reverse_index ON pet(master_id) REVERSE;

# 查看索引个数
select index_name,index_type,table_name from user_indexes order by table_name;

# 查看索引所占空间
select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&index_name')