前段时间遇到设备的数据库记录数很大,导致出现查询、更新异常的情况,于是首先想到的是索引问题,将索引相关创建原则、注意事项、创建方式、删除方式等再整理一下,后面需要使用数据库索引的时候方便回顾。
前言
对一个数据库较大的表创建合适的索引,由此索引的唯一性,可以在很大程度上加快数据检索速度、加快表与表之间的连接、减少查询中分组与排序的事件,从而提高系统性能。但是索引并不是多多益善,因此创建和维护需要耗费时间,而索引也需要占用很大的物理空间,是以空间来换取速度的一种机制,另外更新表时索引也要相应修改。合理的索引能帮助你很大的提高查询效率,但不当的索引也有可能会拖慢查询,尤其是建立复合索引时更要谨慎。
一、索引创建原则
- 表的主键、外键必须有索引;
- 数据量超过300的表应该有索引;
- 经常与其他表进行连接的表,在连接字段上应该建立索引;
- 经常出现在
Where
子句中的字段,特别是大表的字段,应该建立索引; - 索引应该建在选择性高的字段上;
- 索引应该建在小字段上,对于大的文本字段甚至超长字段(例如数据类型为
text
或ntext
的字段),不要建索引; - 频繁进行数据操作的表,不要建立太多的索引;
- 删除无用的索引,避免对执行计划造成负面影响;
二、复合索引注意事项
- 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替;
- 正确选择复合索引中的主列字段,一般是选择性较好的字段;
- 复合索引的几个字段是否经常同时以
AND
方式出现在Where
子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; - 如果复合索引中包含的字段经常单独出现在
Where
子句中,则分解为多个单字段索引; - 如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
- 如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
三、索引创建
在执行CREATE TABLE
语句时可以创建索引,也可以单独用CREATE INDEX
或ALTER TABLE
来为表增加索引。
1. ALTER TABLE
ALTER TABLE
用来创建普通索引、UNIQUE
索引或PRIMARY KEY
索引。
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
其中table_name
是要增加索引的表名,column_list
指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name
可选,缺省时,将根据第一个索引列赋一个名称。另外,ALTER TABLE
允许在单个语句中更改多个表,因此可以同时创建多个索引。
2. CREATE INDEX
CREATE INDEX
可对表增加普通索引或UNIQUE
索引。
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
table_name
、index_name
和column_list
具有与ALTER TABLE
语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX
语句创建PRIMARY KEY
索引。
3. 索引类型
在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY
或UNIQUE
索引。对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。
PRIMARY KEY
索引和UNIQUE
索引非常类似。事实上,PRIMARY KEY
索引仅是一个具有名称PRIMARY
的UNIQUE
索引。这表示一个表只能包含一个PRIMARY KEY
,因为一个表中不可能具有两个同名的索引。 下面的SQL语句对Student
表在SID
上添加PRIMARY KEY
索引。
ALTER TABLE StudentADD PRIMARY KEY (SID)
四、索引删除
可利用ALTER TABLE
或DROP INDEX
语句来删除索引。类似于CREATE INDEX
语句,DROP INDEX
可以在ALTER TABLE
内部作为一条语句处理,语法如下。
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
其中,前两条语句是等价的,删除掉table_name
中的索引index_name
。
第3条语句只在删除PRIMARY KEY
索引时使用,因为一个表只可能有一个PRIMARY KEY
索引,因此不需要指定索引名。如果没有创建PRIMARY KEY
索引,但表具有一个或多个UNIQUE
索引,则SQL将删除第一个UNIQUE
索引。
如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。
评论区