创建索引语法:
CREATE [UNIUQE | BITMAP] INDEX [schema.]index_name
ON [schema.]table_name
([column_name] | [expression] [ASC | DESC],
[column_name] | [expression] [ASC | DESC],...)
[TABLESPACE tablespace_name]
[CLUSTER scheam.cluster]
[INITRANS n]
[MAXTRANS n]
[PCTFREE n]
[STORAGE storage_settings]
[LOGGING | NOLOGGING]
[COMPUTE STATISTICS]
[NOCOMPRESS | COMPRESS nn]
[NOSORT | REVERSE]
[PARTITION | GLOBAL PARTITION partition_setting];
[UNIUQE | BITMAP]:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
[column_name] | [expression] [ASC | DESC]:可以对多列进行联合索引,当为expression时即"基于函数的索引"。
TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)
CLUSTER:指定一个聚簇(Hash cluster不能建索引)
INITRANS、MAXTRANS、PCTFREE:(不能指定pctused),参考:http://blog.csdn.net/huang_xw/article/details/6995442
STORAGE:http://www.cnblogs.com/rootq/articles/1089383.html
[LOGGING | NOLOGGING]:http://www.cnblogs.com/cnjava/archive/2012/04/09/2439497.html
COMPUTE STATISTICS:创建新索引时收集统计信息
NOCOMPRESS | COMPRESS nn:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)
NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值
PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区。参考:http://www.cnblogs.com/tracy/archive/2011/05/31/2064027.html
修改索引:
ALTER [UNIQUE] INDEX [schema.]index_name
[INITRANS n]
[MAXTRANS n]
REBUILD
[STORAGE n];
修改索引的主要任务是修改已存在索引的存储参数,适应增长的需要或者重新建立索引。
REBUILD 是根据原来的索引结构重新建立索引,实际是删除原来的索引后再重新建立。用 REBUILD重建索引可以减少硬盘碎片和提高应用系统的性能。
ALTER INDEX [schema.]index_name COALESCE;
对索引的无用空间进行合并。
删除索引:
DROP INDEX [schema.]indexname;
当不需要时可以将索引删除以释放出硬盘空间。
当表结构被删除时,有其相关的所有索引也随之被删除。
函数索引:
CREATE INDEX index_name ON table_name (expression | function(column_name));
反向键索引:
CREATE INDEX index_name ON table_name (column_name) REVERSE TABLESPACE space_name;
创建唯一索引:
CREATE UNIQUE INDEX index_name ON table_name (column_name) TABLESPACE space_name;
创建组合索引:
CREATE INDEX index_name ON table_name (column_name1, column_name2) TABLESPACE space_name;
索引的优点:
1.可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
2.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
3.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
4.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点:
1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
什么样的列可以建立索引:
1.经常出现在where子句的列;
2.主键(PK)列,唯一键(UK)列,外键(FK)列;
3.经常用于表连接的列,这些列主要是一些外键;
4.在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
5.经常需要排序(order by)和分组(group by)的列;
6.该列是高基数数据列;
7.该列包含很多null值。
什么样的列不应该建立索引:
1.对于那些在查询中很少使用或者参考的列不应该创建索引。
2.对于那些只有很少数据值的列也不应该增加索引,例如性别。(粒度很小的列)
3.对于那些定义为blob数据类型的列不应该增加索引。因为,这些列的数据量要么相当大,要么取值很少。
4.当修改性能远远大于检索性能时,不应该创建索引。因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
索引分类
物理分类:B-tree、位图索引、分区索引、非分区索引
逻辑分类:唯一性索引、非唯一性索引、单列索引、联合索引、函数索引。
各索引介绍,待补充。
http://blog.csdn.net/ceclar123/article/details/8306891
http://orange5458.iteye.com/blog/1165319