1. 索引

索引是帮助MySQL高效获取数据的一种数据结构

10. 索引 - 图1

2. 索引操作

  • 创建索引

      1. create [unique | fulltext] index 索引名称 --unique 唯一索引
      2. [using 索引类型] -- 默认为 btree
      3. on 表名(列名);
  • 查看索引 show index from 表名;

  • 添加索引

    • 普通索引: alter table 表名 add index 索引名称(列名);
    • 组合索引: alter table 表名 add index 索引名称(列名,列名);
    • 主键索引: alter table 表名 add primary key (主键列名);
    • 外键索引: alter table 表名 add constraint 外键名 foreign key (外键列名) references 主表名(主键列名);
    • 唯一索引: alter table 表名 add unique 索引名称(列名);
    • 全文索引: alter table 表名 add fulltext 索引名称(列名);
  • 删除索引 drop index 索引名称 on 表名;

3. 原理

索引是在存储引擎中实现的

BTree 索引类型是基于 B+Tree 数据结构的 , 而B+Tree 是 Btree 的变种, 通常在数据库 和 系统中的文件系统中 特点是能够 保持数据稳定有序

1. 磁盘存储

10. 索引 - 图2

2. BTree

10. 索引 - 图3

由于每次读取到一个磁盘块中的数据 深度 导致效率低

每个节点中包含key值 和 数据 会增加查询时 磁盘IO 次数

3. B+Tree

10. 索引 - 图4

数据只会保持在叶子节点上 并且叶子节点 之间指针相连 方便进行范围查询

非叶子节点只存储 key值 减少磁盘IO的次数 树形结构较小

4. 索引原则

  1. 对查询次数较高 并且数据量比较大的表 建立索引
  2. 建议使用唯一索引 区分度高 索引的效率高
  3. 索引字段的选择 应当从 where 子句的条件中提取
  4. 索引虽然提供效率 但过多不便于维护
  5. 最左匹配原则(只适合于组合索引)

    • 当我们为表中 name age height 添加组合索引 实质上建立了 name 列索引 (name、age) 索引 (name、age、height)索引 使用这三个索引时不区分顺序