[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')