索引分类:
逻辑分类
single column or concatenated 对一列或多列建所引
unique or nonunique 唯一的和非唯一的所引,也就是对某一列或几列的键值(key)是否是唯一的。
Function-based 基于某些函数索引,当执行某些函数时需要对其进行计算,可以将某些函数的计算结果事先保存并加以索引,提高效率。
Doman 索引数据库以外的数据,使用相对较少
物理分类
B-Tree :normal or reverse key B-Tree索引也是我们传统上常见所理解的索引,它又可以分为正常所引和倒序索引。
Bitmap : 位图所引,后面会细讲
B-Tree 索引
B-Tree index 也是我们传统上常见所理解的索引。B-tree (balance tree)即平衡树,左右两个分支相对平衡。
用户登录:
SQL> conn as1/as1
Connected.
创建表:
SQL> create table dex (id int,sex char(1),name char(10));
Table created.
向表中插入1000条数据
SQL> begin
for i in 1..1000
loop
insert into dex values(i,'M','chongshi');
end loop;
commit;
end;
/
PL/SQL procedure successfully completed.
查看表记录
SQL> select * from dex;
ID SE NAME
---------- -- --------------------
... . .....
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
rows selected.
创建索引:
SQL> create index dex_idx1 on dex(id);
Index created.
注:对表的第一列(id)创建索引。
查看创建的表与索引
SQL> select object_name,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
--------------------------------------------------------------------------------
DEX TABLE
DEX_IDX1 INDEX
SQL> create index dex_index2 on dex(sex,name);
Index created.
SQL> select object_name,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
--------------------------------------------------------------------------------
DEX TABLE
DEX_IDX1 INDEX
DEX_INDEX2 INDEX
SQL> select * from dex where id>23 and id<32;
ID SE NAME
---------- -- --------------------
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
rows selected.
如上面查找的列子,通过索引的方式先找到第23条数据,再找到第32条数据,这样就能快速的锁定一个查找的范围,如果每条数据都要从根节点开始查找的话,那么效率就会非常低下。
位图索引
位图索引主要针对大量相同值的列而创建。拿全国居民登录一第表来说,假设有四个字段:姓名、性别、年龄、和身份证号,年龄和性别两个字段会产生许多相同的值,性别只有男女两种值,年龄,1到120(假设最大年龄120岁)个值。那么不管一张表有几亿条记录,但根据性别字段来区分的话,只有两种取值(男、女)。那么位图索引就是根据字段的这个特性所建立的一种索引。
Bitmap Index
从上图,我们可以看出,一个叶子节点(用不同颜色标识)代表一个key , start rowid 和 end rowid规定这种类型的检索范围,一个叶子节点标记一个唯一的bitmap值。因为一个数值类型对应一个节点,当时行查询时,位图索引通过不同位图取值直接的位运算(与或),来获取到结果集合向量(计算出的结果)。 举例讲解:
假设存在数据表T,有两个数据列A和B,取值如下,我们看到A和B列中存在相同的数据。
查看表记录
SQL> select * from dex;
...................
ID SEX NAME
---------- -- --------------------
M chongshi
M chongshi
G chongshi
G chongshi
G chongshi
M chongshi
G chongshi
G chongshi
G chongshi
M chongshi
rows selected.
对于上面表来说sex(性别)只有两种值,最适合用来创建位图所引
创建索引:
SQL> create bitmap index my_bit_idx on dex(sex);
Index created.
查看创建的所引
SQL> select object_name,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
--------------------------------------------------------------------------------
MY_BIT_IDX INDEX
SQL> alter index employees_last _name_idx storage(next 400K maxextents 100);
索引创建后,感觉不合理,也可以对其参数进行修改。详情查看相关文档
调整索引的空间:
新增加空间
SQL> alter index orders_region_id_idx allocate extent (size 200K datafile '/disk6/index01.dbf');
释放空间
SQL> alter index oraers_id_idx deallocate unused;