一文了解MySQL二级索引的查询过程

让我来详细讲解一下“一文了解MySQL二级索引的查询过程”的完整攻略。

什么是MySQL二级索引

MySQL的二级索引也称为非聚集索引。通俗易懂的解释,就是在主索引外的索引,其存储方式为“单独索引”,不绑定表中的具体行数据。

MySQL二级索引查找流程概述

MySQL的二级索引在查找数据时,是通过B+树来实现的。以下是MySQL二级索引查找流程的概述:

  1. 从二级索引B+树的根节点开始,向下定位到相应的叶子节点;
  2. 找到叶子节点后,在其中搜索符合条件的记录;
  3. 根据叶子节点中记录的索引值定位到对应表中的数据行,获取需要的数据;

MySQL二级索引查找流程详解

数据库表的创建和数据插入

代码示例1:创建测试表,并插入5条数据

CREATE TABLE `order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_no` varchar(50) DEFAULT NULL,
  `goods_id` int(11) DEFAULT NULL,
  `amount` decimal(10,2) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_order_goods_id` (`goods_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;

INSERT INTO `order` (`id`, `order_no`, `goods_id`, `amount`, `create_time`)
VALUES
    (1,'order001',101,55.00,'2022-01-01 00:00:00'),
    (2,'order002',102,66.60,'2022-01-02 10:00:00'),
    (3,'order003',103,77.77,'2022-01-03 10:00:00'),
    (4,'order004',104,88.88,'2022-01-04 10:00:00'),
    (5,'order005',105,99.99,'2022-01-05 10:00:00');

以上是创建了名为order的测试表,并在其中插入了五条数据。这个测试表有主键id、一般索引index_order_goods_id以及其他几个字段。

测试1:查询单个字段的数据

代码示例2:查询goods_id101的数据

SELECT * FROM `order` WHERE `goods_id`=101;

以上是查询goods_id101的数据。

MySQL使用二级索引查找的流程如下:

  1. 使用index_order_goods_id二级索引得到符合条件的记录,例如:指向goods_id=101的B+树节点;
  2. goods_id=101这个节点下,找到该节点下所有的叶子节点;
  3. 遍历所有goods_id=101的叶子节点,并获取主键id的值;
  4. 根据获取的主键id值,再次到主键索引树上查找对应的数据,并返回这些数据;

通过以上流程,MySQL进行了一次二级索引查找。 实际上,MySQL使用的是一个排序较快的查找过程,不需要完全遍历所有索引节点,并且B+树叶子节点指向的是数据行地址,特别适合查找件数很多的数据。

测试2:测试不包含二级索引的查询

代码示例3:查询order_noorder002的数据

SELECT * FROM `order` WHERE `order_no`='order002';

以上查询虽然没有使用二级索引,但 MySQL 同样也会先查找有没有二级索引可以使用。然后若二级索引无法使用,就会直接使用主键索引。

  • MySQL首先会检查二级索引,发现没有与order_no这个列相关联的二级索引。
  • MySQL随后将去访问包含该数据的主键索引树,找到该数据,并返回对应的结果。

总结

以上就是“一文了解MySQL二级索引的查询过程”的完整攻略。通过以上的示例和讲解,我们已经大致掌握了 MySQL 的二级索引的查询过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文了解MySQL二级索引的查询过程 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • MySQL利用UNION连接2个查询排序失效详解

    MySQL中的UNION操作符可以将两个或多个SELECT语句的结果集合并在一起,而且不会重复。在使用UNION连接两个查询进行排序时,需要注意以下问题: UNION前后查询的字段数必须相等,且类型也要一致; UNION连接查询的结果集会自动去重,需要使用UNION ALL才能保留重复的记录; UNION操作会对所有的查询进行排序,而且会消耗更多的资源。 下…

    database 2023年5月22日
    00
  • Shell脚本检查IP格式及mysql操作实例

    关于“Shell脚本检查IP格式及Mysql操作实例”的完整攻略,包含以下几个方面: Shell脚本:如何检查IP格式 在Shell脚本中,检查IP格式的方法如下: #!/bin/bash checkip() { ip=$1 if echo $ip | egrep -q ‘^([0-9]{1,3}\.){3}[0-9]{1,3}$’; then return…

    database 2023年5月22日
    00
  • Redis高可用三(Redis Cluster集群)

    https://blog.csdn.net/qq_40298351/article/details/102669146 https://www.cnblogs.com/renpingsheng/p/9813959.html https://www.cnblogs.com/renpingsheng/p/9862485.html 1、redis.conf配置 c…

    Redis 2023年4月12日
    00
  • Linux下创建Postgresql数据库的方法步骤

    下面是创建Postgresql数据库的方法步骤的完整攻略: 步骤一:安装Postgresql 首先需要安装Postgresql数据库,下面介绍在Ubuntu系统下的安装方法: sudo apt-get update sudo apt-get install postgresql 步骤二:创建一个Postgresql用户 创建一个新的Postgresql用户(…

    database 2023年5月22日
    00
  • MySql删除和更新操作对性能有影响吗

    当进行删除和更新操作时,MySQL会涉及到数据的物理删除和更新,这可能会对性能产生一定的影响。下面我将详细讲解MySQL的删除和更新操作对性能的影响以及如何优化。 MySQL删除操作对性能的影响 MySQL的删除操作会先查询要删除的数据,然后再将其从磁盘上删除。如果该表上有索引,则删除操作可能会导致索引的重建,进一步降低性能。此外,删除操作还会影响表的统计信…

    database 2023年5月19日
    00
  • CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14方法分享

    CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14方法分享 本文将讲述如何在CentOS 7.0上编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14,并提供两个示例方便理解。 第一步:安装必需软件 在安装Nginx、MySQL和PHP之前,需要安装一些必需的软件和库文件。以下是所需软件及其安装命…

    database 2023年5月22日
    00
  • C++判断主机是否处于联网状态

    要判断主机是否处于联网状态,可以使用C++的一些网络库,如boost.asio或Winsock等。下面将分别介绍这两种方法。 使用boost.asio判断主机是否处于联网状态 boost.asio是一个跨平台的网络库,它可以在不同的操作系统上实现网络编程。使用boost.asio判断主机是否处于联网状态,可以通过以下步骤: 加载boost.asio库:在C+…

    database 2023年5月21日
    00
  • MySQL Truncate用法详解

    MySQL Truncate用法详解 什么是Truncate? Truncate是MySQL的一个数据操作语句,用于清空一张数据表的所有数据,但是保留表结构。和DROP TABLE不同,使用Truncate操作并不会删除数据表,只是清空了表内的数据。 因为Truncate只清空数据而不删除表结构,所以执行Truncate操作比DELETE操作更快,尤其是对于…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部