一、索引的概念
1.1、数据库索引
- 是一个排序的列表,存储索引值和这个值所对应的物理地址
- 无须对整个表进行的扫描,通过物理地址就可以找到所需数据
- 是表中一列或者若干列值排序的方法
- 需要额外的磁盘空间
1.2、索引的作用
- 能够加快查询速度
- 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本
- 可以加快表于表之间的连接
- 在使用分组和排序时,可大大减少分组和排序的时间
1.3、索引的副作用
- 需要占用额外的磁盘空间
- 在插入和修改数据时需要花费更多的时间,因为索引也要随之改动
二、创建索引的依据条件
索引虽然可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。
- 表的主键、外键必须有索引。因为具有唯一性,查询时可以快速定位
- 记录数超过300行的表应该创建索引
- 经常于其他表进行连接的表,在其连接字段上应该有索引
- 唯一性差的字段不适合建立索引
- 更新太频繁的字段不适合做索引
- 经常出现在 where 子句中的字段,应该建立索引
- 在经常进行 Group by、order by的字段上建立索引
- 索引需建立在小字段上,对于大的文本字段甚至超长字段,不能做索引
三、索引的分类和创建
3.1、普通索引
3.1.1、直接创建索引
create index 索引名 ON 表名 (列名[(length)]);
## [列名(length)]:length 是可选项。如果忽略length的值,则使用整个列的值作为索引;如果指定,使用列的前length个字符来创建索引,在不损失精确性的情况下,长度越短越好
## 索引名建议以 "index" 结尾
例:
create index name_index on member (name);
3.1.2、修改表的方式创建
Alter table 表名 add index 索引名(列名);
3.1.3、创建表的时候指定索引
create table 表名 (字段1 数据类型,字段2 数据类型...,index 索引名(列名));
3.2、唯一索引
与普通索引类似,但区别是唯一索引列的每个值都唯一,唯一索引允许有空值。如果是用组合索引创建,则列的组合必须唯一。添加唯一键将自动创建唯一索引
3.2.1、直接创建唯一索引
create unique index 索引名 on 表名(列名);
例:
create unique index cardid_index on member(cardid);
3.2.2、修改表方式创建
Alter table 表名 add unique 索引名(列名);
3.2.3、创建表的时候指定
create table 表名 (字段1 数据类型,字段2 数据类型...,unique 索引名 (列名));
3.3、主键索引
是一种特殊的唯一索引,必须指定为"primary key"。一个表只能有一个主键,不允许有空值。添加主键将自动创建主键索引。
3.3.1、创建表的时候指定
create table 表名([...],primary key (列名));
3.3.2、修改表方式创建
Alter table 表名 ADD primary key(列名);
例:
alter table member add primary key (id);
3.4、组合索引
可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为select 语句的where条件是依次从左往右执行的,所以在使用select语句查询时where条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效
create table 表名(列名1 数据类型,列名2 数据类型,列名3 数据类型,index 索引名(列名1,列名2,列名3));
例:
select * from 表名 where 列名1='...' and 列名2='..' and 列名3='...';
3.5、全文索引
适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。全文索引可以在char、varchar 或者 text类型的列上创建,每个表只允许有一个全文索引。
3.5.1、直接创建索引
create fulltext index 索引名 on 表名(列名);
3.5.2、修改表的方式创建
alter table 表名 ADD fulltext 索引名(列名);
3.5.3、创建表的时候指定索引
create table 表名(字段1 数据类型...,fulltext 索引名(列名));
## 数据类型可以为char vachar 或者text
3.5.4 使用全文索引查询
select * from 表名 where match(列名) agaginst('查询内容');
四、查看索引
show index from 表名;
show keys from 表名;
五、删除索引
5.1、直接删除索引
drop index 索引名 on 表名;
5.2、修改表方式删除索引
alter table 表名 drop index 索引名;
5.3、删除主键索引
alter table 表名 drop primary key;