索引是一个单独存储在磁盘上的数据库结构,它们包含着对数据表里所有记录的引用指针
在数据库中,索引用来加速对表的查询,索引技术通过使用快速路径访问的方法快速定位数据,减少了磁盘的I/O
可以把索引比作书的目录,每一张表都要有索引,就像每一本书都应该有目录一样。有了索引,数据库的检索速度可以大大提高
索引是作用于表查询的一项技术,因此创建索引时,需要确保该索引是应用在SQL查询语句的条件,一般作为where子句的条件。
在表现形式上,索引表现为一张表,该表保存了主键与索引字段,并指向实体表的记录。索引独立于数据表存放,但不能独立存在,必须属于某个表。索引由数据库自动维护,数据表被删除时,该表上的索引自动被删除。
不过需要注意的是,虽然索引极大地提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete的速度会被降低。 因为更新表时,数据库不仅需要更新表数据,还要更新索
引文件,此外由于索引是独立于表存在的“表”,因此建立索引会占用一定的磁盘空间。
设计索引应遵循如下原则:
当在表上定义primary key或者unique约束条件时,数据库会自动创建一个对应的索引,也就是创建主键索引和唯一索引。
在建表的同时创建索引的语法为:
create table [表名](
[属性名1] [数据类型1] [约束1],
...
[属性名n] [数据类型n] [约束n],
[unique | fulltext | spatial] index|key [索引名](
[属性名1] [(长度)] [asc | desc],
...
[属性名n] [(长度)] [asc | desc]
)
);
例如
建立普通索引
create table normal_table(
id int(20) primary key,
username varchar(20),
email varchar(20),
-- 在id列建立普通索引
index normal_index(id)
);
建立唯一索引
create table unique_table(
id int(20) primary key,
username varchar(20),
email varchar(20),
-- 在email列建立唯一索引,并升序排列
unique index uniquel_index(email asc)
);
建立全文索引
create table fulltext_table(
id int(20) primary key,
username varchar(20),
email varchar(20),
-- 在username列建立全文索引
fulltext index fulltext_index(username)
);
建立单列索引
create table single_table(
id int(20) primary key,
username varchar(20),
email varchar(20),
-- 在username列建立索引,索引长度为9
index single_index(username(9))
);
建立多列索引
create table multi_table(
id int(20) primary key,
username varchar(20),
email varchar(20),
-- 在username列和email列建立索引,索引长度分别为9和10
index multi_index(
username(9),
email(10)
)
);
语法:
alter table [表名] add [unique|fulltext|spatial] [index|key] [索引名](
[属性名1] [(长度)] [asc | desc],
...
[属性名n] [(长度)] [asc | desc]
);
例如:
建立普通索引
-- 在normal_table表的id列建立名为normal_index的普通索引
alter table normal_table add index normal_index(id);
建立唯一索引
-- 在unique_table表的username列建立名为unique_index的唯一索引
alter table unique_table add unique index unique_index(username);
建立多列索引
-- 在multi_table表的username和email列建立名为multi_index的多列索引
alter table multi_table add index multi_index(username, email);
其他类型的索引同理
语法:
create unique [unique|fulltext|spatial] index [索引名] ON [表名](
[属性名1] [(长度)] [asc | desc],
...
[属性名n] [(长度)] [asc | desc]
);
例如
建立普通索引
-- 在normal_table表的id列建立名为normal_index的普通索引
create index normal_index on normal_table(id);
建立唯一索引
-- 在unique_table表的username列建立名为unique_index的唯一索引
create unique index unique_index on unique_table(username);
建立多列索引
-- 在multi_table表的username和email列建立名为multi_index的多列索引
create index multi_table on multi_table(username, email);
其他类型的索引同理
explain关键字用于查看和分析SQL索引使用情况
语法:
explain select * from [表名];
使用里explain语句后,会返回一张表:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
其中对表中字段的说明可以参考这篇博客:mysql中explain查看sql语句索引使用情况
例如:
-- 查看multi_table表中的所有使用情况
explain select * from multi_table;
结果为:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | multi_table | index | multi_table2 | 166 | 1 | 100.00 | Using index |
show index关键字用于查看某一表中的所有索引
语法:
show index from [表名];
使用里show index语句后,会返回一张表:
Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
其中对表中字段的说明可以参考这篇博客:MySQL SHOW INDEX 的语法解析
例如:
-- 查看multi_table表中的全部索引
show index from multi_table;
结果为:
Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
multi_table | 0 | PRIMARY | 1 | id | A | 0 | BTREE | YES | ||||||
multi_table | 1 | multi_index | 1 | username | A | 0 | 9 | YES | BTREE | YES | ||||
multi_table | 1 | multi_index | 2 | A | 0 | 10 | YES | BTREE | YES | |||||
multi_table | 1 | multi_table2 | 1 | username | A | 0 | YES | BTREE | YES | |||||
multi_table | 1 | multi_table2 | 2 | A | 0 | YES | BTREE | YES |
语法:
alter table [表名] drop index [索引名];
例如
-- 从multi_table表中删除multi_index索引
alter table multi_table drop index multi_index;
语法:
drop index [索引名] on [表名];
例如
-- 从multi_table表中删除multi_index索引
drop index multi_index on multi_table;