要点
- 不管以任何方式查询表, 最终都会利用主键通过聚集索引来定位到数据, 聚集索引(主键)是通往真实数据所在的唯一路径。有一种例外可以不使用聚集索引就能查询出所需要的数据, 这种非主流的方法 称之为「覆盖索引」查询, 也就是平时所说的复合索引或者多字段索引查询。
- 改变了平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。
- 非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据
索引能够提高 SELECT 查询和 WHERE 子句的速度,但是却降低了包含 UPDATE 语句或 INSERT 语句的数据输入过程的速度。索引的创建与删除不会对表中的数据产生影响。
CREATE INDEX命令的基本语法如下:
CREATE INDEX index_name ON table_name;
单列索引:
单列索引基于单一的字段创建,其基本语法如下所示:
CREATE INDEX index_name
ON table_name (column_name);
唯一索引::
唯一索引不止用于提升查询性能,还用于保证数据完整性。唯一索引不允许向表中插入任何重复值。其基本语法如下所示:
CREATE UNIQUE INDEX index_name
on table_name (column_name);
聚簇索引::
聚簇索引在表中两个或更多的列的基础上建立。其基本语法如下所示:
CREATE INDEX index_name
on table_name (column1, column2);
什么时候应当避免使用索引
尽管创建索引的目的是提升数据库的性能,但是还是有一些情况应当避免使用索引。下面几条指导原则给出了何时应当重新考虑是否使用索引:
- 小的数据表不应当使用索引;
- 需要频繁进行大批量的更新或者插入操作的表;
- 如果列中包含大数或者 NULL 值,不宜创建索引;
- 频繁操作的列不宜创建索引;
参考:https://zhuanlan.zhihu.com/p/23624390、http://wiki.jikexueyuan.com/project/sql/indexes.html