在数据库中索引最核心的作用是:加速查找。 例如:在含有300w条数据的表中查询,无索引需要700毫秒,而利用索引可能仅需1秒。

在开发过程中会为哪些 经常会被搜索的列 创建索引,以提高程序的响应速度。例如:查询手机号、邮箱、用户名等。

索引原理

为什么加上索引之后速度能有这么大的提升呢? 因为索引的底层是基于B+Tree的数据结构存储的。

数据库的索引是基于上述B+Tree的数据结构实现,但在创建数据库表时,如果指定不同的引擎,底层使用的B+Tree结构的原理有些不同。

  • myisam引擎,非聚簇索引(数据 和 索引结构 分开存储)
  • innodb引擎,聚簇索引(数据 和 主键索引结构存储在一起)

    常见索引

    在innodb引擎下,索引底层都是基于B+Tree数据结构存储(聚簇索引)。

在开发过程中常见的索引类型有:

  • 主键索引:加速查找、不能为空、不能重复。 + 联合主键索引
  • 唯一索引:加速查找、不能重复。 + 联合唯一索引
  • 普通索引:加速查找。 + 联合索引

主键和联合主键索引

  1. create table 表名(
  2. id int not null auto_increment primary key, -- 主键
  3. name varchar(32) not null
  4. );
  5. create table 表名(
  6. id int not null auto_increment,
  7. name varchar(32) not null,
  8. primary key(id)
  9. );
  10. create table 表名(
  11. id int not null auto_increment,
  12. name varchar(32) not null,
  13. primary key(列1,列2) -- 如果有多列,称为联合主键(不常用且myisam引擎支持)
  14. );
  1. alter table 表名 add primary key(列名);
  1. alter table 表名 drop primary key;

注意:删除索引时可能会报错,自增列必须定义为键。

  1. ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
  2. alter table change id id int not null;
  1. create table t7(
  2. id int not null,
  3. name varchar(32) not null,
  4. primary key(id)
  5. );
  6. alter table t6 drop primary key;

唯一和联合唯一索引

  1. create table 表名(
  2. id int not null auto_increment primary key,
  3. name varchar(32) not null,
  4. email varchar(64) not null,
  5. unique ix_name (name),
  6. unique ix_email (email),
  7. );
  8. create table 表名(
  9. id int not null auto_increment,
  10. name varchar(32) not null,
  11. unique (列1,列2) -- 如果有多列,称为联合唯一索引。
  12. );
  1. create unique index 索引名 on 表名(列名);
  1. drop unique index 索引名 on 表名;

索引和联合索引

  1. create table 表名(
  2. id int not null auto_increment primary key,
  3. name varchar(32) not null,
  4. email varchar(64) not null,
  5. index ix_email (email),
  6. index ix_name (name),
  7. );
  8. create table 表名(
  9. id int not null auto_increment primary key,
  10. name varchar(32) not null,
  11. email varchar(64) not null,
  12. index ix_email (name,email) -- 如果有多列,称为联合索引。
  13. );
  1. create index 索引名 on 表名(列名);
  1. drop index 索引名 on 表名;

在项目开发的设计表结构的环节,大家需要根据业务需求的特点来决定是否创建相应的索引。