mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用

聚集索引(Clustered Index)

聚集索引就是按照每张表的主键构造一棵b+树,同时叶子节点中存放的即为整张表的行记录数据。

举个例子,直观感受下聚集索引。

创建表t,并以人为的方式让每个页只能存放两个行记录(不清楚怎么人为控制每页只存放两个行记录):

mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用

最后《MySQL技术内幕》的作者通过分析工具得到这棵聚集索引树的大致构造如下:

mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用

The leaf nodes of a clustered index are referred to as data pages, each of which is linked by a doubly linked list, and the data pages are arranged in the order of primary keys.。

如图所示,每个数据页上存放的是完整的行记录,而在非数据页的索引页中,存放的仅仅是键值及指向数据页的偏移量,而不是一个完整的行记录。

如果定义了主键,InnoDB会自动使用主键来创建聚集索引。当没有定义主键时,InnoDB将选择一个唯一且非空的索引来充当主键。InnoDB会隐式定义一个主键作为聚集索引,如果没有唯一的非空索引。

辅助索引(Secondary Index)

辅助索引,也叫非聚集索引。和聚集索引相比,叶子节点中并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点的索引行还包含了一个书签(bookmark),该书签用来告诉InnoDB哪里可以找到与索引相对应的行数据。

还是以《MySQL技术内幕》中的例子,来直观感受下辅助索引的模样。

还是以上面的表t为例,在列c上创建非聚集索引:

mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用

然后作者通过分析工作得到辅助索引和聚集索引的关系图:

mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用

可以看到辅助索引idx_c的叶子节点中包含了列c的值和主键的值。

举例来说,假设Key的值为0x7fffffff,其中7的二进制表示为0111,0表示为负数。实际的整数值应取反加1,因此得到的结果是-1,并且这是c列的数值。主键值为正数1,由指针值80000001表示,其中8位代表二进制数1000。

覆盖索引(Covering index)

使用InnoDB存储引擎,可以通过辅助索引覆盖索引,直接获取查询记录,无需查询聚集索引中的记录。

使用覆盖索引有啥好处?

可以减少大量的IO操作

上图中我们知道,如果要查询辅助索引中不含有的字段,得先遍历辅助索引,再遍历聚集索引,而如果要查询的字段值在辅助索引上就有,就不用再查聚集索引了,这显然会减少IO操作。

比如上图中,以下sql可以直接使用辅助索引,

select a from where c = -2;

有助于统计

假设存在如下表:

  CREATE TABLE `student` (  `id` bigint(20) NOT NULL,  `name` varchar(255) NOT NULL,  `age` varchar(255) NOT NULL,  `school` varchar(255) NOT NULL,  PRIMARY KEY (`id`),  KEY `idx_name` (`name`),  KEY `idx_school_age` (`school`,`age`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

如果在该表上执行:

select count(*) from student

优化器会怎么处理?

优化器会选择辅助索引来统计,因为尽管遍历聚集索引和辅助索引都可以得到结果,但辅助索引的大小远远小于聚集索引。执行explain命令:

mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用

key和Extra显示使用了idx_name这个辅助索引。

还有,假设执行以下sql:

select * from student where age > 10 and age < 15

因为联合索引idx_school_age的字段顺序是先school再age,按照age做条件查询,通常不走索引:

mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用

但是,如果保持条件不变,查询所有字段改为查询条目数:

select count(*) from student where age > 10 and age < 15

优化器会选择这个联合索引:

mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用

联合索引

联合索引是指对表上的多个列进行索引。

以下为创建联合索引idx_a_b的示例:

mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用

联合索引的内部结构:

mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用

联合索引也是一棵B+树,其键值数量大于等于2。键值都是排序的,通过叶子节点可以逻辑上顺序的读出所有数据。数据(1,1)(1,2)(2,1)(2,4)(3,1)(3,2)是按照(a,b)先比较a再比较b的顺序排列。

基于上面的结构,对于以下查询显然是可以使用(a,b)这个联合索引的:

select * from table where a=xxx and b=xxx ;select * from table where a=xxx;

但是对于下面的sql是不能使用这个联合索引的,因为叶子节点的b值,1,2,1,4,1,2显然不是排序的。

select * from table where b=xxx

联合索引的第二个好处是对第二个键值已经做了排序。举个例子:

create table buy_log(    userid int not null,    buy_date DATE)ENGINE=InnoDB;insert into buy_log values(1, '2009-01-01');insert into buy_log values(2, '2009-02-01');alter table buy_log add key(userid);alter table buy_log add key(userid, buy_date);

当执行

select * from buy_log where user_id = 2;

时,优化器会选择key(userid);但是当执行以下sql:

select * from buy_log where user_id = 2 order by buy_date desc;

时,优化器会选择key(userid, buy_date),因为buy_date是在userid排序的基础上做的排序。

如果把key(userid,buy_date)删除掉,再执行:

select * from buy_log where user_id = 2 order by buy_date desc;

优化器会选择key(userid),但是对查询出来的结果会进行一次filesort,即按照buy_date重新排下序。所以联合索引的好处在于可以避免filesort排序。

以上就是mysql中聚集索引、辅助索引、覆盖索引、联合索引怎么用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/160226.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
电脑主机内存条识别与真假鉴别方法,避免购买到假冒伪劣产品
上一篇 2025年12月5日 15:31:53
linux如何运行c程序命令
下一篇 2025年12月5日 15:34:17

相关推荐

  • 了解MySQL的主要数据类型:熟悉常用的数据类型有哪些

    了解MySQL的主要数据类型:熟悉常用的数据类型有哪些了解MySQL的主要数据类型:熟悉常用的数据类型有哪些了解MySQL的主要数据类型:熟悉常用的数据类型有哪些了解MySQL的主要数据类型:熟悉常用的数据类型有哪些

    MySQL基本数据类型概述:了解常用的数据类型有哪些,需要具体代码示例 MySQL是一种常用的关系型数据库管理系统,它支持多种数据类型。了解这些数据类型对于正确的数据库设计和数据存储至关重要。本文将介绍MySQL中常用的数据类型,并提供具体的代码示例。 整型(INT) 整型是最常用的数据类型之一,用…

    2026年9月27日 • 用户投稿
    100
  • mysql中的asc是什么意思 mysql排序asc用法解析

    在mysql中,asc是指升序排序。1. asc代表”ascending”,用于将查询结果按指定列从小到大排序。2. 适用于数字、字符串和日期,字符串按字典顺序,日期按时间顺序。3. 使用索引可以优化排序性能。使用asc可以有效组织和展示数据,但需注意优化和调试。 在MySQ…

    2026年9月27日
    100
  • Maestro函数确定性修改技巧

    Maestro函数确定性修改技巧Maestro函数确定性修改技巧Maestro函数确定性修改技巧Maestro函数确定性修改技巧

    首先打开SQL Maestro程序,并建立与MySQL数据库的连接。 在主界面中找到并点击“数据库浏览器”菜单项,即可展开数据库对象树形结构。 从数据库列表中选择目标数据库,确保已成功连接到正确的数据源。 在数据库浏览器中定位到函数对象,准备进行后续操作。 图改改 在线修改图片文字 455 查看详情…

    2026年9月27日 • 用户投稿
    100
  • 更新 MySQL 记录

    更新 MySQL 记录更新 MySQL 记录更新 MySQL 记录更新 MySQL 记录

    标题:MySQL UPDATE语句的代码示例 在MySQL数据库中,UPDATE语句用于修改已存在的数据记录。本文将针对UPDATE语句进行详细说明,并给出具体的代码示例。 UPDATE语句的语法结构:UPDATE table_nameSET column1 = value1, column2 = …

    2026年9月27日 • 用户投稿
    100
  • Java中高并发数据库同步与任务处理教程

    Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程

    本文旨在探讨Java应用中处理高并发数据库操作的有效策略,尤其针对大量数据行的计算与状态更新场景。我们将介绍如何利用ExecutorService和任务对象实现并发处理,并通过数据库连接池优化资源管理。重点关注数据库层面的并发控制机制,如事务和行级锁,以确保数据一致性和系统性能,并提供实际的代码示例…

    2026年9月27日 • 用户投稿
    200
  • Java高并发数据库同步处理:高效任务调度与连接管理实践

    Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践

    本文深入探讨了在Java应用中处理海量数据并发同步的策略。通过将数据库操作封装为独立任务,结合ExecutorService进行高效调度,并利用数据库连接池(如HikariCP)优化资源管理,同时强调了数据库层面事务和锁机制的重要性。文章提供了实现并发处理、标记已消费行以及确保系统高性能和数据一致性…

    2026年9月27日 • 用户投稿
    200
  • MySQL默认账号密码的设定有哪些要求?

    MySQL默认账号密码的设定有哪些要求?MySQL默认账号密码的设定有哪些要求?MySQL默认账号密码的设定有哪些要求?MySQL默认账号密码的设定有哪些要求?

    MySQL默认账号密码的设定有哪些要求? MySQL是一种流行的开源关系型数据库管理系统,用于管理和存储大量数据。在安装MySQL时,会设置一个默认的账号密码,以确保数据安全性。默认账号密码的设定有一些要求和注意事项,本文将介绍MySQL默认账号密码的要求和示例代码。 一、账号要求: 默认的超级用户…

    2026年9月27日 • 用户投稿
    100
  • 如何确定 MySQL 的主机名?

    如何确定 MySQL 的主机名?如何确定 MySQL 的主机名?如何确定 MySQL 的主机名?如何确定 MySQL 的主机名?

    如何确定 MySQL 的主机名? 在使用 MySQL 数据库时,有时候我们需要确定 MySQL 数据库的主机名来进行连接操作。确定 MySQL 的主机名其实并不复杂,下面将详细介绍如何确定 MySQL 的主机名,并附上代码示例。 首先,我们可以通过以下几种方式来确定 MySQL 的主机名: 通过配置…

    2026年9月27日 • 用户投稿
    200
  • 解决MySQL安装中文乱码问题的有效途径

    解决MySQL安装中文乱码问题的有效途径解决MySQL安装中文乱码问题的有效途径解决MySQL安装中文乱码问题的有效途径解决MySQL安装中文乱码问题的有效途径

    标题:解决MySQL安装中文乱码问题的有效途径及代码示例 随着互联网的发展,数据处理变得越来越重要,而数据库则成为了数据存储和管理的重要工具之一。MySQL作为一款开源的关系型数据库管理系统,在各种应用场景中被广泛使用。然而,由于字符集的差异,有时在MySQL安装和配置过程中会出现中文乱码的问题,给…

    2026年9月27日 • 用户投稿
    100
  • 解决多层级关联表级联删除失败的策略与实践

    解决多层级关联表级联删除失败的策略与实践解决多层级关联表级联删除失败的策略与实践解决多层级关联表级联删除失败的策略与实践解决多层级关联表级联删除失败的策略与实践

    本文旨在深入探讨在多层级数据库关联中(如祖父-父-子关系)如何有效处理级联删除引发的SQLIntegrityConstraintViolationException。我们将重点分析外键约束的工作原理,并提供基于数据库设计和SQL语句的解决方案,包括使用ON DELETE CASCADE、ON DEL…

    2026年9月27日 • 用户投稿
    600
  • MySQL事务应用指南:5种情况下最适合使用事务

    MySQL事务应用指南:5种情况下最适合使用事务MySQL事务应用指南:5种情况下最适合使用事务MySQL事务应用指南:5种情况下最适合使用事务MySQL事务应用指南:5种情况下最适合使用事务

    MySQL事务应用指南:5种情况下最适合使用事务,需要具体代码示例 在数据库管理领域中,事务处理是一种重要的技术手段,可以确保数据库操作的一致性、完整性和可靠性。而MySQL作为一种流行的关系型数据库管理系统,也提供了强大的事务支持。在实际应用中,合理地运用事务可以有效地保证数据的准确性和可靠性。本…

    2026年9月27日 • 用户投稿
    100
  • 构建用户-员工关联的图片上传系统:实现员工为特定用户上传文件

    本文详细阐述了如何构建一个系统,使员工能够为特定用户上传文件(例如QR码),并确保文件与用户准确关联。核心在于优化数据库结构,为上传的文件表引入用户ID外键,并在前端上传表单和后端处理逻辑中实现用户ID的传递与存储,从而实现用户专属内容的管理与展示。 1. 引言:明确用户与文件关联的需求 在许多业务…

    2026年9月27日
    100
  • MySQL事务的隔离级别与并发控制

    MySQL事务的隔离级别与并发控制MySQL事务的隔离级别与并发控制MySQL事务的隔离级别与并发控制MySQL事务的隔离级别与并发控制

    标题:深入探讨MySQL事务的隔离级别与并发控制 随着数据库应用场景的日益复杂,事务的隔离级别与并发控制成为了数据库管理中不可或缺的重要话题。MySQL作为一款广泛使用的关系型数据库管理系统,其事务处理功能也备受广大开发者重视。本文将深入探讨MySQL事务的隔离级别与并发控制,并结合具体的代码示例进…

    2026年9月27日 • 用户投稿
    100
  • laravel怎么动态地修改当前请求的数据库连接_laravel动态修改请求数据库连接方法

    laravel怎么动态地修改当前请求的数据库连接_laravel动态修改请求数据库连接方法laravel怎么动态地修改当前请求的数据库连接_laravel动态修改请求数据库连接方法laravel怎么动态地修改当前请求的数据库连接_laravel动态修改请求数据库连接方法laravel怎么动态地修改当前请求的数据库连接_laravel动态修改请求数据库连接方法

    可通过DB门面切换连接,使用DB::connection(‘mysql_secondary’)执行特定查询;2. 修改模型实例连接,调用setConnection()改变数据源;3. 利用中间件如TenantDatabaseMiddleware解析请求信息并动态设置默认连接;…

    2026年9月27日 • 用户投稿
    400
  • MySQL事务的基本概念解析

    MySQL事务的基本概念解析MySQL事务的基本概念解析MySQL事务的基本概念解析MySQL事务的基本概念解析

    MySQL事务的基本概念解析 MySQL是一种常用的关系型数据库管理系统,支持事务处理。事务是数据库操作的基本单位,通过事务可以保证一系列操作的原子性、一致性、隔离性和持久性。本文将详细介绍MySQL事务的基本概念,并通过具体的代码示例来演示。 一、事务的概念和特性事务是一系列数据库操作的逻辑单位,…

    2026年9月27日 • 用户投稿
    200
  • 如何在Windows和Linux服务器中检测混淆命令

    如何在Windows和Linux服务器中检测混淆命令如何在Windows和Linux服务器中检测混淆命令如何在Windows和Linux服务器中检测混淆命令如何在Windows和Linux服务器中检测混淆命令

    工具介绍 在目前的无文件恶意软件或网络犯罪领域中,命令行混淆已经是很常见的了。为了绕过基于签名的安全检测机制,红队渗透测试以及apt攻击活动都会使用各种专用的混淆/模糊技术。同时,许多代码混淆工具(即执行语法转换工具)都已开源,这也使得网络攻击者们对给定命令进行混淆处理变得越来越容易了。 然而,针对…

    2026年9月27日 • 用户投稿
    1000
  • MySQL查询:如何使用“以”开头条件筛选数据?

    MySQL查询:如何使用“以”开头条件筛选数据?MySQL查询:如何使用“以”开头条件筛选数据?MySQL查询:如何使用“以”开头条件筛选数据?MySQL查询:如何使用“以”开头条件筛选数据?

    MySQL查询:如何使用“以”开头条件筛选数据? 在进行MySQL查询时,有时候我们需要按照某个字段的开头字符筛选数据,其中一个常见的需求就是按照某个字段的开头字符为特定值进行筛选。在MySQL中,我们可以使用通配符“%”来表示匹配任意字符,本文将介绍如何使用“以”开头条件来筛选数据,并提供具体的代…

    2026年9月27日 • 用户投稿
    000
  • 如何选择适合的自动清洗油烟机(功能对比指南)

    如何选择适合的自动清洗油烟机(功能对比指南)如何选择适合的自动清洗油烟机(功能对比指南)如何选择适合的自动清洗油烟机(功能对比指南)如何选择适合的自动清洗油烟机(功能对比指南)

    问题: 如何在 php 中使用 pdo 扩展连接数据库?简单说明: pdo(php 数据对象)是一个 php 扩展,它提供了一种面向对象的方式来连接和操作数据库。它提供了与多种数据库(如 mysql、postgresql 和 sqlite)的统一接口。阅读本文,您将了解:使用 pdo 连接到数据库的…

    2026年9月27日 • 用户投稿
    100
  • MySQL bin目录下的文件详解及作用介绍

    MySQL bin目录下的文件详解及作用介绍MySQL bin目录下的文件详解及作用介绍MySQL bin目录下的文件详解及作用介绍MySQL bin目录下的文件详解及作用介绍

    MySQL bin目录下的文件详解及作用介绍 MySQL是一种流行的关系型数据库管理系统,其bin目录下存储着许多重要的可执行文件和脚本。本文将详细介绍MySQL bin目录下的一些主要文件及其作用,同时提供代码示例帮助读者更好地理解。 mysql:mysql是MySQL客户端命令行工具,用于与My…

    2026年9月27日 • 用户投稿
    000
  • 如何处理MySQL安装时出现的中文乱码情况

    如何处理MySQL安装时出现的中文乱码情况如何处理MySQL安装时出现的中文乱码情况如何处理MySQL安装时出现的中文乱码情况如何处理MySQL安装时出现的中文乱码情况

    当我们在安装MySQL时出现中文乱码情况时,通常是因为数据库的字符集设置不正确所导致的。在这种情况下,我们需要对MySQL的字符集进行调整,以确保可以正确存储和展示中文字符。下面将介绍如何处理MySQL安装时出现的中文乱码情况,并提供具体的代码示例。 1. 查看MySQL当前的字符集设置 在解决My…

    2026年9月27日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信