Mysql Index

MySQL 索引

InnoDB 索引模型

在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。

每一个索引在 InnoDB 里面对应一棵 B+ 树

根据叶子节点的内容,索引类型分为主键索引和非主键索引。

主键索引

主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。

非主键索引

非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

对于表 T(ID, K) 举例:

通过主键索引查询方式,如 SELECT * FROM T WHERE ID = ? 只需要搜索 ID 这棵 B+ 树;

通过非主键索引查询方式,如 SELECT * FROM T WHERE K = ? 则需要先搜索 k 索引树,得到 ID 的值,再到 ID 索引树搜索一次。这个过程称为回表

覆盖索引

如果执行的语句是 SELECT ID FROM T WHERE K = ?,这时只需要查 ID 的值,而 ID 的值已经在 K 索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里面,索引 K 已经“覆盖了”我们的查询需求,我们称为覆盖索引。

由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

最左前缀原则

B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录。

对于表 T(ID, name, age) 表,(name, age) 联合索引来举例:

当你的逻辑需求是查到所有名字是“张三”的人时,SELECT * FROM T WHERE name = '张三',可以通过改聚合索引快速定位到指定行,然后向后遍历得到所有需要的结果。

如果你要查的是所有名字第一个字是"张"的人,你的 SQL 语句的条件是 WHERE name LIKE '张%'。这时,你也能够用上这个索引。

可以看到,不只是索引的全部定义,只要满足最左前缀,就可以利用索引来加速检索。这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。

Last updated on 2023-03-19 21:23:50