MySQL的索引可以分为以下几类:
普通索引和唯一索引
普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。
唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。主键索引是一种特殊的唯一索引,不允许有空值。
单列索引和组合索引
单列索引即一个索引只包含单个列,一个表可以有多个单列索引。
组合索引指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀集合。
全文索引
全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在CHAR、VARCHAR或者TEXT类型的列上创建。MySQL中只有MyISAM存储引擎支持全文索引。
空间索引
空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING和POLYGON。MySQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类似的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MyISAM的表中创建。
创建表时创建索引的基本语法格式如下:
CREATE TABLE table_name [column_name data_type]
[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name [length]) [ASC | DESC]
UNIQUE、FULLTEXT、SPATIAL为可选参数,分别表示唯一索引、全文索引和空间索引;
INDEX和KEY为同义词,两者作用相同,用来指定创建索引;
index_name指定索引的名称,为可选参数,如果不指定,MySQL默认用col_name为索引值;
length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
ASC或DESC指定升序或者降序的索引值存储。
使用EXPLAIN语句查看索引是否正在使用:
EXPLAIN SELECT * FROM 表明 WHERE 索引列+匹配条件\G
EXPLAIN语句输出结果的各行解释如下:
组合索引可起几个索引的作用,但是使用时并不是随便查询哪个字段都可以使用索引,而是遵从“最左前缀”。如果列不构成索引最左面的前缀,MySQL不能使用局部索引,如在组合索引 INDEX(a,b,c) 使用(b,c)组合则不能使用索引查询。
创建空间索引
空间索引必须在MyISAM类型的表中创建,且空间类型的字段必须为非空,具体语法格式如下:
CREATE TABLE table_name
(
g GEOMETRY NOT NULL,
SPATIAL INDEX 索引名(g)
)ENGINE = MyISAM;
使用ALTER TABLE语句创建索引
ALTER TABLE
创建索引的基本语法如下:
ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY]
[index_name] (col_name[length],...) [ASC|DESC]
添加索引前,使用SHOW INDEX语句查看指定表中创建的索引:
SHOW INDEX FROM table_name\G
其中,各个主要参数的含义为:
使用CREATE INDEX创建索引
CREATE INDEX
语句可以在已经存在的表上添加索引,MySQL中CREATE INDEX被映射到一个ALTER TABLE语句上,基本语法结构为:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
ON table_name (col_name[length],...) [ASC| DESC]
使用ALTER TABLE删除索引
ALTER TABLE
删除索引的基本语法格式如下:
ALTER TABLE table_name DROP INDEX index_name;
提示:添加AUTO_INCREMENT
约束字段的唯一索引不能被删除。
使用DROP INDEX语句删除索引
DROP INDEX
删除索引的基本语法格式如下:
DROP INDEX index_name ON table_name;
提示:删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。如果组成索引的所有列都被删除,那么整个索引将被删除。