1、索引定义
百科:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
分析:索引是一种排序的结构;它需要对数据项建立索引并存储在物理空间中。
不同的索引类型和数据库,索引的建立和索引的查找机制会有所不同。
索引的作用就是加快查找的速度。
同时,由于在插入数据、修改数据时会创建索引或修改索引,因此会消耗数据库的性能和存储空间。
2、索引的分类
2.1 聚簇索引(clustered index)
2.1.1 创建聚簇索引
create clustered index index_name on tablename(column);
2.1.2 特点
表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种。
2.1.3 聚簇索引的唯一性
正式聚簇索引的顺序就是数据的物理存储顺序,所以一个表最多只能有一个聚簇索引,因为物理存储只能有一个顺序。正因为一个表最多只能有一个聚簇索引,所以它显得更为珍贵,一个表设置什么为聚簇索引对性能很关键。
2.2 非聚簇索引(non-clustered index)
2.2.1 创建非聚簇索引
create nonclustered index index_name on tablename(column);
2.2.2 特点
表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。
3、索引使用原则
1、不要索引数据量不大的表,对于小表来讲,表扫描的成本并不高。
2、不要设置过多的索引,在没有聚集索引的表中,最大可以设置249个非聚集索引,过多的索引首先会带来更大的磁盘空间,
而且在数据发生修改时,对索引的维护是特别消耗性能的。
3、合理应用复合索引,有某些情况下可以考虑创建包含所有输出列的覆盖索引。
4、对经常使用范围查询的字段,可能考虑聚集索引。
5、避免对不常用的列,逻辑性列,大字段列创建索引。
6、有大量重复值、且经常有范围查询( > ,< ,> =,< =)和order by、group by发生的列,可考虑建立群集索引;
7、经常同时存取多列,且每列都含有重复值可考虑建立组合索引;
8、组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好,恰好相反过多的索引会导致系统低效。用户在表中每加进一个索引,维护索引集合就要做相应的更新工作。
9、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。
10、多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。
连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案。
11、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
12、IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引。
13、只要能满足你的需求,应尽可能使用更小的数据类型:例如使用MEDIUMINT代替INT
14、尽量把所有的列设置为NOT NULL,如果你要保存NULL,手动去设置它,而不是把它设为默认值。
15、尽量少用VARCHAR、TEXT、BLOB类型。
16、如果你的数据只有你所知的少量的几个。最好使用ENUM类型。
下表给出了何时使用聚簇索引与非聚簇索引:
动作 | 使用聚簇索引 | 使用非聚簇索引 |
列经常被分组排序 | 应 | 应 |
返回某范围内的数据 | 应 | 不应 |
一个或极少不同值 | 不应 | 不应 |
小数目的不同值 | 应 | 不应 |
大数目的不同值 | 不应 | 应 |
频繁更新的列 | 不应 | 应 |
外键列 | 应 | 应 |
主键列 | 应 | 应 |
频繁修改索引列 | 不应 | 应 |