MySQL查询性能优化七种武器之链路追踪「建议收藏」

MySQL查询性能优化七种武器之链路追踪「建议收藏」MySQL优化器可以生成Explain执行计划,我们可以通过执行计划查看是否使用了索引,使用了哪种索引?
但是到底为什么会使用这个索引,我们却无从得知。
好在MySQL提供了一个好用的工具 — opt

MySQL查询性能优化七种武器之链路追踪

MySQL优化器可以生成Explain执行计划,我们可以通过执行计划查看是否使用了索引,使用了哪种索引?

但是到底为什么会使用这个索引,我们却无从得知。

好在MySQL提供了一个好用的工具 — optimizer trace(优化器追踪),可以帮助我们查看优化器生成执行计划的整个过程,以及做出的各种决策,包括访问表的方法、各种开销计算、各种转换等。

1. 查看optimizer trace配置

show variables like "%optimizer_trace%";

image

输出参数详解:

optimizer_trace 主配置,enabled的on表示开启,off表示关闭,one_line表示是否展示成一行

optimizer_trace_features 表示优化器的可选特性,包括贪心搜索、范围优化等

optimizer_trace_limit 表示优化器追踪最大显示数目,默认是1条

optimizer_trace_max_mem_size 表示优化器追踪占用的最大容量

optimizer_trace_offset 表示显示的第一个优化器追踪的偏移量

2. 开启optimizer trace

optimizer trace默认是关闭,我们可以使用命令手动开启:

SET optimizer_trace="enabled=on";

image

3. 线上问题复现

先造点数据备用,创建一张用户表:

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT "主键",
  `name` varchar(100) NOT NULL COMMENT "姓名",
  `gender` tinyint NOT NULL COMMENT "性别",
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`),
  KEY `idx_gender_name` (`gender`,`name`)
) ENGINE=InnoDB COMMENT="用户表";

创建了两个索引,分别是(name)和(gender,name)。

执行一条SQL,看到底用到了哪个索引:

select * from user where gender=0 and name="一灯";

image

跟期望的一致,优先使用了(gender,name)的联合索引,因为where条件中刚好有gendername两个字段。

我们把这条SQL传参换一下试试:

select * from user where gender=0 and name="张三";

image

这次竟然用了(name)上面的索引,同一条SQL因为传参不同,而使用了不同的索引。

到这里,使用现有工具,我们已经无法排查分析,MySQL优化器为什么使用了(name)上的索引,而没有使用(gender,name)上的联合索引。

只能请今天的主角 —optimizer trace(优化器追踪)出场了。

3. 使用optimizer trace

使用optimizer trace查看优化器的选择过程:

SELECT * FROM information_schema.OPTIMIZER_TRACE;

image

输出结果共有4列:

QUERY 表示我们执行的查询语句

TRACE 优化器生成执行计划的过程(重点关注)

MISSING_BYTES_BEYOND_MAX_MEM_SIZE 优化过程其余的信息会被显示在这一列

INSUFFICIENT_PRIVILEGES 表示是否有权限查看优化过程,0是,1否

接下来我们看一下TRACE列的内容,里面的数据很多,我们重点分析一下range_scan_alternatives结果列,这个结果列展示了索引选择的过程。

image

输出结果字段含义:

index 索引名称

ranges 查询范围

index_dives_for_eq_ranges 是否用到索引潜水的优化逻辑

rowid_ordered 是否按主键排序

using_mrr 是否使用mrr

index_only 是否使用了覆盖索引

in_memory 使用内存大小

rows 预估扫描行数

cost 预估成本大小,值越小越好

chosen 是否被选择

cause 没有被选择的原因,cost表示成本过高

从输出结果中,可以看到优化器最终选择了使用(name)索引,而(gender,name)索引因为成本过高没有被使用。

再也不用担心找不到MySQL用错索引的原因,赶紧用起来吧!

文章持续更新,可以微信搜一搜「 一灯架构 」第一时间阅读更多技术干货。
image

原文地址:https://www.cnblogs.com/yidengjiagou/archive/2022/08/17/16594161.html

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

(0)
上一篇 2023-05-31
下一篇 2023-05-31

相关推荐

  • python基础小记(Python入门笔记)

    python基础小记(Python入门笔记) Python是一种跨平台的计算机程序设计语言,是一种面向对象的动态类型语言,越来越多被用于独立的,大型项目的开发,已被逐渐广泛应用于系统管理任务的处理和Web编程。下面给大家带来一些关于Python 学习心得 ,希望对大家有所帮助。

    2023-11-03
    151
  • 50个SQL语句(MySQL版) 问题五[亲测有效]

    50个SQL语句(MySQL版) 问题五[亲测有效]表结构 student(StuId,StuName,StuAge,StuSex) 学生表 teacher(TId,Tname) 教师表 course(CId,Cname,C_TId) 课程表 sc(S

    2023-02-25
    143
  • Python接口的重要性

    Python接口的重要性Python是一种高级语言,以其简洁的语法和灵活性而著称。在当前快速发展的互联网和移动应用生态体系中,Python的角色越来越关键。Python的主要优点之一是其完美的接口性,它提供了各种接口工具,其实现和开发都非常容易,而且非常有用,使得Python在实际应用场景中具有广泛的适用性和可扩展性。

    2024-08-15
    31
  • 正确姿势开发vue后台管理系统[亲测有效]

    正确姿势开发vue后台管理系统[亲测有效]相信许多人和我一样刚接触 vue 时看文档都很枯燥,看完 vue,还有 vueRouter 、vuex 、vue-cli、es6 (学不动了。。。 ) 对于看完教程之后又迟迟不能上手实际项目,只能写一些简单的小demo,这肯定和实际生产工作是有出入的,于是乎我就打算自己从零开始…

    2023-03-02
    159
  • CrateDB分布式数据库[亲测有效]

    CrateDB分布式数据库[亲测有效]今日在portianer后台,查询应用模板时,偶尔看到一个名为CrateDB的数据,顺手查了一下。其中就一一篇标题名为“比Postgre快10倍的开源数据库CrateDB”的文章,第一个感觉,就是口…

    2023-03-08
    169
  • Python DataFrame遍历

    Python DataFrame遍历在数据分析、挖掘与建模中,DataFrame 是不可或缺的一种数据结构。然而,在进行数据处理时,往往需要对 DataFrame 进行遍历操作。本文将从多个方面介绍 Python 中对 DataFrame 进行遍历的方法。

    2024-07-12
    41
  • 掌握Python的数据分布分析技能,揭示数据背后的规律

    掌握Python的数据分布分析技能,揭示数据背后的规律在现代社会中,数据已经成为一种重要的资源。通过数据分析,我们可以更好地理解市场、用户和业务,从而指导公司的经营决策。而在进行数据分析之前,对数据分布的了解是非常重要的。

    2024-01-10
    114
  • SQL查询结果排序_sql中查询结果多余5条

    SQL查询结果排序_sql中查询结果多余5条【SQL从一点一滴分析系列文章】为实际开发中的点点滴滴的总结,从最最简单的SQL 查询 到 综合分析查询 在分析 SQL 时,也会同时分析 mybatis 、Hibernate 中的相关操作 点击查…

    2023-01-29
    151

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注