Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL索引之B+树、覆盖索引与最左前缀

MySQL索引之B+树、覆盖索引与最左前缀原则详解

作者:dsq_MaDing

文章浏览阅读1k次,点赞9次,收藏12次。本文深入探讨了MySQL中B+树索引的结构特点及其在数据库中的应用,解释了覆盖索引的概念、优点以及最左前缀原则,并通过实例说明了这些索引技术如何提升查询效率。

一、引言

在 MySQL 数据库中,索引是提高查询效率的关键工具。

合理地使用索引可以显著减少数据库的查询时间,提升系统的性能。

二、B+ 树索引结构

2.1 B+ 树概述

B+ 树是一种多路平衡查找树,它是 MySQL 中最常用的索引数据结构。与传统的二叉树不同,B+ 树的每个节点可以有多个子节点,这使得树的高度相对较低,从而减少了磁盘 I/O 次数,提高了查询效率。

2.2 B+ 树的结构特点

2.3 B+ 树在 MySQL 索引中的应用

在 MySQL 中,主键索引和辅助索引都使用 B+ 树结构。主键索引的叶子节点存储了完整的数据记录,而辅助索引的叶子节点存储了索引键和对应的主键值。当使用辅助索引进行查询时,首先在辅助索引的 B+ 树中查找对应的主键值,然后再根据主键值在主键索引的 B+ 树中查找完整的数据记录。

2.4 示例说明

假设我们有一个用户表 users,包含 id(主键)、name 和 age 三个字段。如果我们在 name 字段上创建了一个辅助索引,那么该辅助索引的 B+ 树结构如下:

三、覆盖索引

3.1 覆盖索引的概念

覆盖索引是指一个查询语句的执行只需要从索引中获取所需的数据,而不需要回表查询。回表查询是指在使用辅助索引查询到主键值后,还需要根据主键值在主键索引中查找完整的数据记录。如果一个查询可以通过辅助索引直接获取所需的全部数据,就避免了回表查询,从而提高了查询效率。

3.2 覆盖索引的优点

3.3 示例说明

假设我们有一个用户表 users,包含 id(主键)、name 和 age 三个字段,并且在 name 和 age 字段上创建了一个联合索引 idx_name_age。当我们执行以下查询时:

SELECT name, age FROM users WHERE name = 'John' AND age = 25;

由于查询所需的 name 和 age 字段都包含在 idx_name_age 索引中,因此可以直接从索引中获取所需的数据,而不需要回表查询,这就是一个覆盖索引的应用。

四、最左前缀原则

4.1 最左前缀原则的概念

最左前缀原则是指在使用联合索引时,MySQL 会从联合索引的最左边的列开始匹配。如果查询条件中不包含联合索引的最左边的列,那么 MySQL 将无法使用该联合索引。

4.2 最左前缀原则的应用

SELECT * FROM users WHERE name = 'John';
SELECT * FROM users WHERE name = 'John' AND age = 25;

而以下查询无法使用该索引:

SELECT * FROM users WHERE age = 25;

4.3 示例说明

假设我们有一个用户表 users,包含 id(主键)、name、age 和 gender 四个字段,并且创建了一个联合索引 idx_name_age_gender。以下是一些查询示例:

SELECT * FROM users WHERE name = 'John';
SELECT * FROM users WHERE name = 'John' AND age = 25;
SELECT * FROM users WHERE name = 'John' AND age = 25 AND gender = 'Male';
SELECT * FROM users WHERE age = 25;
SELECT * FROM users WHERE gender = 'Male';
SELECT * FROM users WHERE age = 25 AND gender = 'Male';

五、总结

B+ 树是 MySQL 索引的核心数据结构,它的平衡性和多路特性使得查询效率得到了显著提升。覆盖索引通过避免回表查询,进一步提高了查询速度。

最左前缀原则是使用联合索引的重要准则,遵循该原则可以确保联合索引得到有效的利用。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文