什么是 MySQL 的“回表”?
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
摘要:数据库回表操作解析
本文通过解释 MySQL 中的索引结构和两种索引类型的区别,分析了什么是回表以及为何需要回表。
1. 索引结构
MySQL 使用 B+Tree 作为索引存储的数据结构。B+Tree 相比于 B-Tree,其非叶子节点不存储具体记录的指针,只有叶子节点才会。这种结构降低了树的高度,提高了搜索效率,并且由于叶子结点相互链接,更加适合范围扫描。一个三层的 B+Tree 可以存储约 2100 万条数据,而且在 InnoDB 存储引擎中,B+Tree 的高度一般为 2-4 层,足以处理千万级的数据存储和检索。
2. 两类索引
MySQL 索引可以分为聚簇索引(主键索引)和非聚簇索引(二级或辅助索引)。聚簇索引的叶子结点存储完整的数据记录,而非聚簇索引的叶子结点只存储主键值。查询时,如果通过主键索引,只需搜索一次 B+Tree;但如果通过非主键索引,则需要先找到主键值,然后再搜索主键索引的 B+Tree,这个过程称为回表。因此,若可能,优先使用主键索引进行搜索。
3. 一定会回表吗?
并非所有非主键索引的查询都需要回表。如果查询涉及的列已包含在索引中,即使是二级索引,也不需回表,这称为索引覆盖扫描。
4. 扩展
自增主键的使用建议基于其空间占用小和插入效率高的特点。自增主键由于占用空间小,可以减少二级索引的叶子节点占用空间,提高搜索效率;同时,插入操作简单,无需处理叶子节点分裂等问题,提升了插入效率。但业务需求可能导致无法使用自增主键,在这种情况下需要根据业务选择最佳实践。
想要了解更多内容?