MySQL 的索引介绍

144 阅读4分钟

一、索引的概念

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;