广告
返回顶部
首页 > 资讯 > 数据库 >MySQL索引查询的具体使用
  • 475
分享到

MySQL索引查询的具体使用

MySQL索引查询MySQL索引 2023-05-19 08:05:55 475人浏览 独家记忆
摘要

目录索引的分类聚簇索引非聚簇索引实战理解我们都知道Mysql的辅助索引可以提升检索效率,但是为什么有的时候,走辅助索引反而不如走主键索引的效率高呢?这里我觉得需要先弄懂辅助索引的底层

我们都知道Mysql的辅助索引可以提升检索效率,但是为什么有的时候,走辅助索引反而不如走主键索引的效率高呢?这里我觉得需要先弄懂辅助索引的底层原理以及回表查询的概念。

ps:下边我们讨论的场景主要是针对innodb存储引擎为前提。

索引的分类

在我们给mysql表建立索引的时候,一共有两种,分别是聚簇索引,非聚簇索引。

聚簇索引

聚簇索引会将索引和对应的行记录数据内容都统一存放在同一个叶子节点中。例如下图所示:

image.png

从上图中我们可以看到,最上头是非叶子结点,这种非叶子结点里面存储的是主键id的值,而非叶子结点的内部会有个数据页的指针,这些指针会指向下层的B+树节点,一般B+树的最底层我们称之为叶子结点。在聚簇索引的叶子结点里面,会存储主键id和对应的行记录内容。

非聚簇索引

非聚簇索引的结构如下所示:

image.png

可以看到,在非聚簇索引中,所有的叶子结点都包含了辅助索引的值和主键的值。而当我们要根据辅助索引查询的时候,最终就会通过使用辅助索引定位到具体的叶子结点,最后根据叶子节点里面的主键id去聚簇索引的b+树中检索具体的行记录。

下边我们通过一组代码案例来深入了解下回表的知识点。

实战理解

首先需要创建一张表用于做测试

CREATE TABLE `t_common` (
  `a` int unsigned NOT NULL AUTO_INCREMENT,
  `b` int DEFAULT NULL,
  `c` int DEFAULT NULL,
  `d` int DEFAULT NULL,
  PRIMARY KEY (`a`),
  KEY `ud_b_c` (`b`,`c`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3;

然后我们插入一些测试数据:

INSERT INTO `t_common` (`a`, `b`, `c`, `d`)
VALUES
	(1, 1, 1, 1),
	(2, 2, 2, 2);

接着我们来看看下边的几个sql案例:

1.全表扫描

select a,b,c,d from t_common;

explain结果如下:

image.png

可以看到这条sql需要从mysql中检索出a,b,c,d四个字段,走的是全表扫描,并没有走索引。

2.按照c关键字查询

select a,b,c,d from t_common where c=1;

explain结果如下:

image.png

可以看到,这里也是走了全表扫描。

3.按照b关键字查询

select a,b,c,d from t_common where c=1;

explain结果如下:

image.png

可以看到,结果是走了b,c联合索引。这里的结果也应证了最左匹配原则的说法。但是这里因为查询出来的d字段不在bc索引树上,因此需要回表。

4.按照c关键字查询,只返回b,c字段

select b,c from t_common where c=1;

explain结果如下:

image.png

这种情况有点特殊,按理说他是不满足最左匹配原则的,但是由于检索的内容正好是辅助索引的字段,同时扫描辅助索引的io开销要比扫描主键索引的IO开销小,所以这里的查询对辅助索引树进行了全表扫描。

(开销更小的原因是:因为主键索引存储的是行记录,加载的数据更多。走普通索引的时候,叶子节点存储的是主键id值,这样一次加载的数据会更多,走普通索引效率比主键索引要高。)

5.按照c关键字查询,返回a,b,c字段

select a,b,c from t_common where c=1;

explain结果如下:

image.png

这种情况和上边的情况相同,由于c的查询不满足最左匹配原则,原先是不不应该走b,c索引的,但是后期优化器发现,需要查询的字段正好是辅助索引的字段内容,而扫描辅助索引的IO开销要比扫描主键索引的IO开销小,所以这里的查询对辅助索引树进行了全表扫描。

(开销更小的原因是:因为主键索引存储的是行记录,加载的数据更多。走普通索引的时候,叶子节点存储的是主键id值,这样一次加载的数据会更多,走普通索引效率比主键索引要高。)

6.按照b关键字进行查询,查询a,b,c,是否有回表

select a,b,c from t_common where b=1;

explain结果如下:

image.png

这种情况下,要注意,由于我们的bc索引的叶子结点包含了主键的值,所以其实减少了回表查询的情况。但是如果我们看回上边所说的第三种情况,第三种查询其实还需要通过一次回表的操作,去查询d的值。

7.如果查询的字段包含了主键索引和辅助索引,优先走辅助索引

select a,b,c from t_common;

explain结果:

image.png

因为主键索引存储的是行记录,加载的数据更多。走普通索引的时候,叶子节点存储的是主键id值,这样一次加载的数据会更多,走普通索引效率比主键索引要高。所以这条sql直接扫描了整个b,c联合索引树。

到此这篇关于MySQL索引查询的具体使用的文章就介绍到这了,更多相关MySQL索引查询内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL索引查询的具体使用

本文链接: https://www.lsjlt.com/news/212859.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL索引查询的具体使用
    目录索引的分类聚簇索引非聚簇索引实战理解我们都知道MySQL的辅助索引可以提升检索效率,但是为什么有的时候,走辅助索引反而不如走主键索引的效率高呢?这里我觉得需要先弄懂辅助索引的底层...
    99+
    2023-05-19
    MySQL索引查询 MySQL索引
  • Mysql中强制索引的具体使用
    目录强制索引使用题外话哪些情况适合建立索引哪些情况不适合建立索引强制索引 强制索引,即指定本次查询使用某个特定的索引,这样就可避免mysql优化器使用低效的索引或者走全表扫描放弃使用索引。(Mysql的优化器并不完全可靠...
    99+
    2023-08-14
    Mysql 强制索引
  • MySQL查询冗余索引和未使用过的索引操作
    MySQL5.7及以上版本提供直接查询冗余索引、重复索引和未使用过索引的视图,直接查询即可。 查询冗余索引、重复索引 select * sys.from schema_...
    99+
    2022-11-12
  • mysql or走索引加索引及慢查询的作用
    目录 前言一 概述二 实验表结构声明三 Mysql不走索引归类以及详细解析1. 查询条件在索引列上使用函数操作,或者运算的情况2. 查询条件字符串和数字之间的隐式转换3. ...
    99+
    2022-11-13
  • mysql or走索引加索引及慢查询的作用
    目录 前言一 概述二 实验表结构声明三 mysql不走索引归类以及详细解析1. 查询条件在索引列上使用函数操作,或者运算的情况2. 查询条件字符串和数字之间的隐式转换3. 特殊修饰符 %%, Or 将不走索引4...
    99+
    2022-09-12
  • mysql多条件查询会使用索引吗
    mysql多条件查询会使用索引,取决因素有:1、索引的选择性,指索引中具有唯一或较小重复值的比例;2、索引的覆盖度,指索引中包含了查询所需的所有列,从而避免了对实际数据行的访问,提高查询性能;3、查询的顺序和条件结合,根据查询的具体情况进行...
    99+
    2023-07-25
  • 优化MySQL查询的具体方法
    下文主要给大家带来优化MySQL查询的具体方法,希望这些内容能够带给大家实际用处,这也是我编辑优化MySQL查询的具体方法这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。    ...
    99+
    2022-10-18
  • MySQL多表查询的具体实例
    一 使用SELECT子句进行多表查询 SELECT 字段名 FROM 表1,表2 … WHERE 表1.字段 =&nb...
    99+
    2022-05-16
    MySQL 多表查询
  • mysql查询索引状态的方法
    这篇文章将为大家详细讲解有关mysql查询索引状态的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql查询索引状态的方法:通过“SHOW INDEX”语句,语法...
    99+
    2022-10-18
  • Mysql索引查询失效的情况
    一:不在索引上使用函数,计算等 在kq_time上增加了一个索引,见图一 我们使用date()函数进行查询,见图二 图二根据kq_time字段查询并没有使用索引,我们可以根据kq_time换一种写法,他就可以走索引了,见...
    99+
    2021-05-22
    Mysql索引查询失效的情况
  • mysql分页查询语句的具体用法
    这篇文章主要讲解了“mysql分页查询语句的具体用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql分页查询语句的具体用法”吧! SQL Serv...
    99+
    2022-10-18
  • SQL 嵌套查询的具体使用
    目录插入数据  select子查询(外语句先执行,内语句后执行)总结嵌套查询又称子查询,有select子查询,where子查询,from子查询,exists子查询。 插入数据&nb...
    99+
    2023-01-28
    SQL嵌套查询
  • SQL嵌套查询的具体使用
    目录插入数据  select子查询(外语句先执行,内语句后执行)总结嵌套查询又称子查询,有select子查询,where子查询,from子查询...
    99+
    2023-01-28
    SQL 嵌套查询
  • SQL Server索引结构的具体使用
    目录名词介绍索引表数据页索引是数据库的基础,只有先搞明白索引的结构,才能搞明白索引运行的逻辑 本文通过 索引表、数据页、执行计划、IO统计、B+Tree 来尽可能的介绍 SQL 语句...
    99+
    2022-11-13
  • 怎么合理的使用MySQL索引结构和查询
    这篇文章主要讲解了“怎么合理的使用MySQL索引结构和查询”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么合理的使用MySQL索引结构和查询”吧!一、高性...
    99+
    2022-10-18
  • mysql索引的查询语句怎么写
    这篇文章主要介绍“mysql索引的查询语句怎么写”,在日常操作中,相信很多人在mysql索引的查询语句怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql索引的查询...
    99+
    2022-10-19
  • mysql可以查询表中的索引吗
    mysql可以查询表中的索引,实现方式有:1、DESC指令,显示表的结构信息,包括索引,命令示例“DESC 表名;”;2、SHOW INDEX指令,展示表的索引信息,命令示例“SHOW INDEX FROM 表名”;3、INFORMATIO...
    99+
    2023-07-25
  • MySQL中使用IN()查询到底走不走索引?
    MySQL中使用IN()查询到底走不走索引? 看数据量 EXPLAINSELECT * from users WHERE is_doctor in (0,1); 很明显没走索...
    99+
    2023-10-27
    原型模式 java spring 开发语言 后端
  • TK-MyBatis分页查询的具体使用
    记 tkMybatis 查询出一个  List集合 该集合已经做好了一层分页Page封装 即查询出的list 使用类型判断 instanceof Page 为true 但是,中途不明...
    99+
    2022-11-12
  • MySQL索引提高查询效率的方法
    这篇文章主要介绍了MySQL索引提高查询效率的方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。正文MySQL的索引本质上是一种数据结构让我们先...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作