概述
索引是对数据库表中的一列或多列进行排序的一种结构,索引可以大大提高MySQL的查询速度,对MySQL的高效运行至关重要,数据库的索引如同目录对于书的重要性。
索引优缺点
优点
- 减少了需要扫描的数据量,从而加快了检索速度
- order by时可以不用排序,因为索引本身有序
- 唯一索引可以保证数据库表每一行数据唯一
- 加速表的join
缺点
- 索引会占用额外的存储空间
- 维护索引耗费时间,每次增删改都要维护索引
索引创建规则
虽然索引可以加速检索,但也要按一定的规则创建,否则适得其反。
应该创建索引
- where 中经常使用的列
- order by 使用的列
- join 使用的列
- 范围检索,< <= > >= BETWWEEN IN等
不应创建索引
- 数据量很少的时候,全表扫描即可
- 重复值多的列,如性别
- text、image、bit类型的列
索引结构
MySQL的索引采用B+树存储,B+树的特征:
- 关键字都出现在叶子节点
- 非叶子节点只用于快速检索到叶子节点,不存储关键字
- 每一个叶子节点都包含指向下一个叶子节点的指针,方便范围遍历
索引分类
按功能划分
- 主键索引:一张表只能有一个主键索引,不允许重复,不允许为NULL
- 唯一索引:数据不允许重复,但允许NULL值
- 普通索引:允许数据重复,允许NULL
- 全文索引:查找文本中的关键词,用于全文检索,使用场景较少
按列数划分
- 单一索引:一个索引只包含一列
- 组合索引/联合索引:包含两列及以上,查询时要遵循最左匹配原则,即where条件中要按照建立索引时字段的排列方式才有效
按存储划分
- 聚簇索引:数据和索引存放在一起
- 非聚簇索引:数据和索引分开存放
主键索引是聚簇索引,其他索引是非聚簇索引。根据主键查找数据时查到了键就得到了数据,其他索引需要先查到主键,然后根据主键再找到数据
关于主键索引
- 数据插入速度依赖于插入顺序,按照主键顺序插入最快,否则会出现页分裂影响性能。一般定义自增的ID作为主键
- 主键更新代价很高,因为数据也要一起移动,尽量设计主键为不可更新。