InnoDB中的索引
1.1索引的常见模型
- 哈希表:哈希表这种结构适用于只有等值查询的场景
- 有序数组:有序数组在等值查询和范围查询场景中的性能就都非常优秀,但是由于数组在更新数据的时候就必须得挪动后面所有的记录成本太高,所以有序数组索引只适用于静态存储引擎。
- 搜索树:查询性能和更新性能良好。
1.2 InnoDB 的索引模型
在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表, InnoDB 使用了 B+ 树索引模型,数据都是存储在 B+ 树中的。
- 主键索引:主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引 。
- 非主键索引:叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引,一般如果索引中不包含全部需要查询的值需要(根据查到的主键回到主键索引查)回表。
主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。
索引优化:
- 覆盖索引:索引中已经“覆盖了”我们的查询需求,我们称为覆盖索引。(如下,需要查询id,已存在索引中无需回表)
select id from student where age between 17 and 23
- 联合索引/符合索引:是再表中两个或两个以上的列创建的索引。利用索引中的附加列,可以缩小检索的段池范围,更快的搜索到数据。
- 最左前缀原则:比如 (name ,age)联合索引,当我们单独查询name的时候也可以用上这个索引。(使用前缀索引就用不上覆盖索引对查询性能的优化了)
- 索引下推:MySQL 5.6 引入的索引下推优化,可以在索引遍历过 程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
power by 丁奇
非InnoDB索引密集索引与稀疏索引我傻傻的搞不懂,也被很多三手资料博客误导
下是在知乎评论区看到觉得讲的很好 -作者id如图