MySQL索引

64 阅读2分钟

概述

索引是对数据库表中的一列或多列进行排序的一种结构,索引可以大大提高MySQL的查询速度,对MySQL的高效运行至关重要,数据库的索引如同目录对于书的重要性。

索引优缺点

优点

  • 减少了需要扫描的数据量,从而加快了检索速度
  • order by时可以不用排序,因为索引本身有序
  • 唯一索引可以保证数据库表每一行数据唯一
  • 加速表的join

缺点

  • 索引会占用额外的存储空间
  • 维护索引耗费时间,每次增删改都要维护索引

索引创建规则

虽然索引可以加速检索,但也要按一定的规则创建,否则适得其反。

应该创建索引

  • where 中经常使用的列
  • order by 使用的列
  • join 使用的列
  • 范围检索,< <= > >= BETWWEEN IN等

不应创建索引

  • 数据量很少的时候,全表扫描即可
  • 重复值多的列,如性别
  • text、image、bit类型的列

索引结构

MySQL的索引采用B+树存储,B+树的特征:

  • 关键字都出现在叶子节点
  • 非叶子节点只用于快速检索到叶子节点,不存储关键字
  • 每一个叶子节点都包含指向下一个叶子节点的指针,方便范围遍历

索引分类

按功能划分

  • 主键索引:一张表只能有一个主键索引,不允许重复,不允许为NULL
  • 唯一索引:数据不允许重复,但允许NULL值
  • 普通索引:允许数据重复,允许NULL
  • 全文索引:查找文本中的关键词,用于全文检索,使用场景较少

按列数划分

  • 单一索引:一个索引只包含一列
  • 组合索引/联合索引:包含两列及以上,查询时要遵循最左匹配原则,即where条件中要按照建立索引时字段的排列方式才有效

按存储划分

  • 聚簇索引:数据和索引存放在一起
  • 非聚簇索引:数据和索引分开存放

主键索引是聚簇索引,其他索引是非聚簇索引。根据主键查找数据时查到了键就得到了数据,其他索引需要先查到主键,然后根据主键再找到数据

关于主键索引

  • 数据插入速度依赖于插入顺序,按照主键顺序插入最快,否则会出现页分裂影响性能。一般定义自增的ID作为主键
  • 主键更新代价很高,因为数据也要一起移动,尽量设计主键为不可更新。