索引是一种用于快速查询的数据结构,不同的存储引擎使用不同的索引。由于索引文件很大,索引一般存储在磁盘上,所以影响索引速度的关键因素为磁盘IO次数,越少越快。
优点
- 加快查询速度
- 唯一索引,保证数据的唯一性
- 进行分组、排序查找时,性能显著
缺点
- 索引占用磁盘空间
- 对数据进行增、删、改时,都需要维护索引数据
索引结构
B树索引(变异版二叉树结构)
- 查询从根节点开始,无需全表扫描,节省时间
- 叶节点按顺序排列,适合顺序查找、范围查找
- 将随机IO转化成顺序IO
限制
- 索引查找时,顺序必须从最左侧开始,否则索引无效
- 不能跳过索引的列
- 如果某一列使用like查询,其右侧字段均无法使用索引优化查询
哈希索引(索引值生成哈希值,按哈希值排序)
- 索引每一行包含哈希值(索引列生成唯一值)、指向数据的指针
限制
- 因为按照哈希值匹配,所以只能精确匹配所有索引字段,然后根据指针找到对应行数据
索引物理存储
存储方式分为聚簇索引与非聚簇索引。聚簇索引表示索引与表数据存放在一起。innoDB与MyISAM虽然都说过B+结构,但是实现方式不同。
InnoDB
- 聚集索引表示叶子节点包含主键值以及行数据,主要用在innoDB
- innoDB数据文件就是索引文件,key为主键称为主索引innoDBinnoDB
- 辅助索引时,叶子节点保存辅助索引以及主键值,与聚集索引的不同时,需要根据主键进行二次查询,相对效率变低
- 当存在主键时,默认创建聚集索引,一个表有且仅有一个;不存在则以第一个唯一值键为主键,否则创建一个rowid作为主键,rowid为不可见。
MyISAM
- MyISAM索引保存与InnoDB不同,索引与行数据分离保存,索引中包含索引值以及数据指针
索引类型
- 主键索引
- 单列索引
- 唯一索引,可用来保证数据的唯一性
- 组合索引,需满足最左前缀原则
总结
- 尽量少使用单行索引,尽量使用覆盖索引(索引包含所需所有数据),避免二次查询,节省时间
- 尽量按照顺序的范围查找,顺序IO比随机IO速度快
- 索引列不能表达式的一部分,也不能是函数的参数
- 某列范围查询,则其后所有列索引无效