mysql_index.txt
索引是加快访问表内容的基本手段,尤其是在涉及多个表的关联查询里。
MySQL提供了多种灵活的索引创建办法:
可以对单个列或多个列建立索引。多列索引也被称作复合索引。
索引可以只包含唯一值,也可以包含重复值。
可以为同一个表创建多个索引,帮助优化对标的不同类型的查询。
对于除ENUM和SET以外的字符串类型,可以利用列的前缀创建索引。也就是说,支队列名的最左边n个字符(对于非二进制串类型)或n个字节(对于二进制串类型)创建索引。
存储引擎的索引特性
索引特性 | InnoDB | MyISAM | MEMORY |
---|---|---|---|
是否允许使用null值 | 是 | 是 | 是 |
每个索引的列数 | 16 | 16 | 16 |
每个表的索引数 | 64 | 64 | 64 |
索引行的最大长度(字节) | 3072 | 1000 | 3072 |
是否支持列前缀索引 | 是 | 是 | 是 |
列前缀的最大长度(字节) | 767 | 1000 | 3072 |
是否支持BLOB/TEXT索引 | 是 | 是 | 否 |
是否支持FULLETXT索引 | 5.6.4版本以上 | 是 | 否 |
是否支持SPATIAL索引 | 否 | 是 | 否 |
是否支持HASH索引 | 否 | 否 | 是 |
索引的分类
唯一索引。对于单列值、或多列(复合)索引都不允许重复值
常规索引(非唯一)。会出现重复值的情况
FULLTEXT索引。用于全文检索,引擎支持详见上图表格
……
创建索引
ALTER TABLE tb1_name ADD INDEX index_name(index_columns);
ALTER TABLE tb1_name ADD UNIQUE index_name(index_columns);
ALTER TABLE tb1_name ADD PRIMARY KEY (index_columns);
ALTER TABLE tb1_name ADD FULLTEXT index_name(index_columns);
ALTER TABLE tb1_name ADD SPATIAL index_name(index_columns);
其中,tb1_name是要添加索引的那张表的名字,index_columns是要进行索引的列(如果要索引多个列,则需要使用逗号隔开)。索引名index_name是可选的。如果没指定它,那么MySQL会根据第一个索引列的名字选取一个名字。
如果想要限制某个索引,让它只包含唯一值,那么可以把这个索引创建为PRIMARY KEY或UNIQUE索引。这两种索引很相似,主要区别为:
1,每个表只能包含一个primary key。因为primary key的名字总是为primary,而同一个表不允许有两个同名的索引。可以在一个表里放置多个unique索引。
2,primary key不可以包含null值,而unique索引可以。如果某个unique索引包含了null值,那么它就可以包含多个null值。这是因为null值不会与任何值相等,甚至与另一个null值也一样不相等。
除了primary key以外,大部分索引类型都可以用create index语句添加:
CREATE INDEX index_name ON ta1_name (index_columns);
CREATE UNIQUE INDEX index_name ON tb1_name (index_columns);
CREATE FULLTEXT INDEX index_name ON tb1_name (index_columns);
CREATE SPATIAL INDEX index_name ON tb1_name (index_columns);
如果想在创建表的时候创建索引,语法格式为:
CREATE TABLE tb1_name{
...列定义...
INDEX index_name (index_columns),
UNIQUE index_name(index_columns),
PRIMARY KEY (index_columns),
FULLTEXT index_name(index_columns),
SPATIAL index_name (index_columns),
...
};
作为一个特殊情况,通过在某列的定义末尾加上primary key或unique子句,可以创建一个单列的primary key或unique索引。例如下面两条create table是等价的:
CREATE TABLE mytb1{
i INT NOT NULL PRIMARY KEY,
j CHAR(10) NOT NULL UNIQUE
};
CREATE TABLE mytb1{
i INT NOT NULL,
j CHAR(10) NOT NULL,
PRIMARY KEY(i),
UNIQUE(J)
};
删除索引
删除索引的语法是,使用DROP INDEX或ALTER TABLE语句。如果要使用DROP INDEX语句,则必须给出那个要被删除的索引的名字:
DROP INDEX index_name ON tb1_name;
如果要用DROP INDEX语句来删除PRIMARY KEY,则必须以带引号标识符的形式给指定名字PRIMARY:
DROP INDEX 'PRIMARY' ON tb1_name;
与CREATE INDEX语句相类似,DROP INDEX语句会被内部处理成ALTER TABLE语句。
ALTER TABLE tb1_name DROP INDEX index_name;
ALTER TABLE tb1_name DROP PRIMARY KEY;