MySQL 索引简介
索引的含义和特点
索引是创建在表上的,是对数据库表中一列或多列的值进行排序的一种结构,可以提高查询速度。使用索引类似于使用新华字典的音序表,通过提取拼音,可以快速定位该数据的位置
索引有其明显的优势,也有不可避免的缺点:
- 创建和维护索引同样需要耗费时间,并随着数据量的增加而增加
- 索引也会占用一定的物理空间
- 增加、删除和修改数据时,要动态地维护索引
索引的分类和操作
1. 普通索引
所谓普通索引,就是在创建索引时,不附加任何限制条件(唯一、非空等限制),可以创建在任何数据类型的字段上
创建表时直接创建索引
CREATE TABLE tablename(
propname1 type1 [CONSTRAINT1],
propname2 type2 [CONSTRAINT2],
......
INDEX|KEY [indexName] (propname1 [(length) [ASC|DESC]])
);
在已存在的表上通过 CREATE 语句创建索引
CREATE INDEX indexName ON tablename (propname [(length) [ASC|DESC]])
通过 ALTER TABLE 语句创建
ALTER table tablename ADD INDEX|KEY indexName(propname [(length) [ASC|DESC]])
2. 唯一索引
所谓唯一索引,就是在创建索引时,限制索引的值必须唯一,主键就是一种特殊的唯一索引
创建表时直接创建索引
CREATE TABLE tablename(
propname1 type1 [CONSTRAINT1],
propname2 type2 [CONSTRAINT2],
......
UNIQUE INDEX|KEY [indexName] (propname1 [(length) [ASC|DESC]])
);
在已存在的表上通过 CREATE 语句创建索引
CREATE UNIQUE INDEX indexName ON tablename (propname [(length) [ASC|DESC]])
通过 ALTER TABLE 语句创建
ALTER table tablename ADD UNIQUE INDEX|KEY indexName(propname [(length) [ASC|DESC]])
3. 全文索引
全文索引主要关联在 CHAR、VARCHAR 和 TEXT 字段上,以便能更加快速地查询数据量较大的字符串类型字段
创建表时直接创建索引
CREATE TABLE tablename(
propname1 type1 [CONSTRAINT1],
propname2 type2 [CONSTRAINT2],
......
FULLTEXT INDEX|KEY [indexName] (propname1 [(length) [ASC|DESC]])
);
在已存在的表上通过 CREATE 语句创建索引
CREATE FULLTEXT INDEX indexName ON tablename (propname [(length) [ASC|DESC]])
通过 ALTER TABLE 语句创建
ALTER table tablename ADD FULLTEXT INDEX|KEY indexName(propname [(length) [ASC|DESC]])
4. 多列索引
所谓多列索引,是指在创建索引时关联多个字段。虽然可以通过所关联的字段进行查询,但是只有查询条件中使用了所关联字段中的第一个字段,多列索引才会被使用
创建表时直接创建索引
CREATE TABLE tablename(
propname1 type1 [CONSTRAINT1],
propname2 type2 [CONSTRAINT2],
......
INDEX|KEY [indexName] (propname1 [(length) [ASC|DESC]],
propname2 [(length) [ASC|DESC]],
......);
);
在已存在的表上通过 CREATE 语句创建索引
CREATE INDEX indexName ON tablename (propname1 [(length) [ASC|DESC]],
propname2 [(length) [ASC|DESC]],
......);
通过 ALTER TABLE 语句创建
ALTER table tablename ADD INDEX|KEY indexName(propname1 [(length) [ASC|DESC]],
propname2 [(length) [ASC|DESC]],
......);
5. 删除索引
DROP INDEX indexName ON tablename;
索引的设计原则
- 选择唯一性索引,可以更快速地确定某条记录
- 为经常需要排序、分组和联合操作的字段建立索引
- 为经常需要作为查询条件的字段建立索引
- 限制索引的数目,索引越多,占用的空间就越多,修改表时对索引的重构和更新也很麻烦
- 尽量使用数据量少的索引,索引的值越长,查询速度也会受影响
- 尽量使用前缀来索引,对于 TEXT 和 BLOB 类型的字段,进行全文索引会很浪费时间,如果只检索字段前面的若干字段,可以提高速度
- 删除不再使用或很少使用的索引