索引分类
(1)普通索引(Key Indexes)
(2)唯一索引(Unique Indexes)
(3)主键索引(Primary Key Indexes)
(4)组合索引(Composite Index)
(5)前缀索引( Prefix Indexes)
(6)全文索引(Full-Text Indexes)
(7)哈希索引(Hash Indexes)
(8)空间索引(Spatial Indexes)
普通索引
普通索引是最基本的索引,没什么限制,根据创建时机不同,主要有两种方式:
(1)在创建表时同时创建普通索引
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
(
col_name column_definition,
INDEX|KEY [index_name] [index_type] (col_name [(length)] [ASC | DESC])
)
index_type:
USING {BTREE | HASH}
其中方括号[]中内容表示可选项,竖线|表示两者选一。
(1)col_name:列名;
(2)column_definition:列的具体定义,这里省略了;
(3)INDEX|KEY:表示使用INDEX和KEY都能创建普通索引,因为在MySQL中,INDEX和KEY是一样的。
(4)[index_name]:索引的名字,是可选项,如果没有写,默认使用字段名作为索引的名称,一般以idx_字段名作为前缀来命名;
(5)[index_type]:索引类型,表示索引的数据结构,有两类:BTREE和HASH,如果没有指明,默认是BTREE;
(6)col_name [(length)] [ASC | DESC]:col_name是要添加索引的列,length表示要在类型为字符串的列的前length个字符构成的字符串上添加索引,[ASC|DESC]表示升序还是降序方式存储索引,默认是升序方式存储;
例:
CREATE TABLE my_table
(
id INT(11) not NULL auto_increment,
name VARCHAR(20) NOT NULL,
address VARCHAR(20) NOT NULL,
PRIMARY KEY(id),
INDEX idx_name (name)
);
该语句在创建my_table表时,同时在字段name上创建了一个名为idx_name的的普通索引。
(2)创建表之后创建索引
——修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name (col_name [(length)] [ASC | DESC])
例如:
ALTER TABLE my_table ADD INDEX idx_address (address)
该语句在my_table表的address字段上添加了名为idx_address的普通索引。
——直接创建索引
CREATE INDEX index_name ON table(column[(length)] [ASC|DESC])
例如:
CREATE INDEX idx_name ON my_table(name)
可以使用如下DDL语句删除索引:
DROP INDEX index_name ON my_table
唯一索引
与普通索引类似,不同的是要求索引列的值必须唯一,但是多个NULL值。与普通索引创建方式相似:
创建表时创建:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
(
col_name column_definition,
UNIQUE [INDEX|KEY] [index_name] [index_type] (col_name [(length)] [ASC | DESC])
)
index_type:
USING {BTREE | HASH}
创建表后直接创建:
CREATE UNIQUE INDEX index_name ON table(column[(length)] [ASC|DESC])
修改表结构方式创建:
ALTER TABLE table_name ADD UNIQUE indexName (column(length))
主键索引
主键索引不需要主动取创建,表创建主键后,自动在主键上创建,主键索引名称总是为PRIMARY,主键值的唯一和非空也就保证了主键索引的列值必须唯一且不能为空,所以主键索引可以看成是特殊的唯一索引。
CREATE TABLE my_table
(
id INT(11) not NULL auto_increment,
name VARCHAR(20) NOT NULL,
address VARCHAR(20) NOT NULL,
PRIMARY KEY(id)
);
该语句在创建表时创建了主键id,同时会在id上创建主键索引,如图:
组合索引
指在多个字段上创建的索引,在多个字段上创建的普通索引和唯一索引都是组合索引,所谓组合实际是字段的组合,对于多个字段上的唯一索引,要求组合字段必须唯一。可以如下创建组合索引
CREATE TABLE my_table
(
id INT(11) not NULL auto_increment,
name VARCHAR(20) NOT NULL,
address VARCHAR(20) NOT NULL,
PRIMARY KEY(id),
INDEX idx_name_address (name,address)
);
该语句在字段name和address两个字段上创建普通索引,结果如图:
如果要在两个字段上创建唯一索引,只要将INDEX替换成UNIQUE即可。
也可以在创建表后创建组合索引
ALTER TABLE table_name ADD INDEX idx_name_address (name,address);
CREATE INDEX idx_name_address ON my_table(name,address)
前缀索引
全文索引
哈希索引
哈希索引是基于哈希表实现的,只有精确匹配索引中所有列的查询,哈希所有才有效。