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

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

但我们并不确切地知道为什么使用这个索引。

[En]

But we don’t know exactly why this index is used.

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

1. 查看optimizer trace配置

show variables like '%optimizer_trace%';

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

输出参数详解:

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";

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

3. 线上问题复现

首先创建一些要备份的数据,然后创建一个用户表:

[En]

First create some data for backup, and create a user table:

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='一灯';

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

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

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

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

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

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

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

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

3. 使用optimizer trace

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

SELECT * FROM information_schema.OPTIMIZER_TRACE;

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

输出结果共有4列:

QUERY 表示我们执行的查询语句
TRACE 优化器生成执行计划的过程(重点关注)
MISSING_BYTES_BEYOND_MAX_MEM_SIZE 优化过程其余的信息会被显示在这一列
INSUFFICIENT_PRIVILEGES 表示是否有权限查看优化过程,0是,1否

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

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

输出结果字段含义:

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用错索引的原因,赶紧用起来吧!

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

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

Original: https://www.cnblogs.com/yidengjiagou/p/16594161.html
Author: 一灯架构
Title: MySQL查询性能优化七种武器之链路追踪

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505004/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MyBatis-Plus入门教程及基本API使用案例

    一、MyBatisPlus简介 1. 入门案例 问题导入 MyBatisPlus环境搭建的步骤? 1.1 SpringBoot整合MyBatisPlus入门程序 ①:创建新模块,选…

    数据库 2023年5月24日
    099
  • 001从零开始入门Entity Framework Core——基础知识

    1、对于 EF Core,使用模型执行数据访问。 模型由 实体类和表示数据库会话的 上下文对象构成。 上下文对象允许查询并保存数据。 2、EF 支持以下模型开发方法: 从现有数据库…

    数据库 2023年6月14日
    092
  • 边缘计算 | 在移动设备上部署深度学习模型的思路与注意点 ⛵

    💡 作者:韩信子@ShowMeAI📘 深度学习◉技能提升系列:https://www.showmeai.tech/tutorials/35📘 深度学习实战系列:https://ww…

    数据库 2023年6月14日
    0104
  • windows安装mysql8.0.29(ZIP解压安装版本)

    一. 下载mysql 8.0.29软件包 二. 解压,初始化安装 1,打开下载后文件所在目录,使用解压软件解压,打开文件夹!(如图,文件路径不要出现中文!) 2,创建my.ini文…

    数据库 2023年6月16日
    082
  • canal

    canal 简介 canal 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 canal 工作原理: canal 模拟 MySQL slave 的交互协议…

    数据库 2023年5月24日
    096
  • jdbc-对其中三步的封装

    package com.cqust.utils; import java.sql.*; public class JDBCUtil {static {try {//注册驱动类加载的…

    数据库 2023年6月11日
    081
  • [LeetCode]剑指 Offer 17. 打印从1到最大的n位数

    输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n = 1输出: [1,2,3…

    数据库 2023年6月9日
    089
  • django-ckeditor上传图片到七牛云OSS

    参考信息 django-ckeditor本地图片上传功能:https://www.jianshu.com/p/882cf85b604fdjango+ckeditor+七牛云,图片上…

    数据库 2023年6月9日
    084
  • 一致性hash算法

    背景 当我们的业务系统大到一定程度的时候,一台缓存服务器显然不能满足需求,需要使用多台缓存服务器。然后缓存服务器具体一定的用户粘性属性,如何设计缓存服务器使其命中率提高,并具有伸缩…

    数据库 2023年6月9日
    084
  • K8S的安装部署以及基础知识

    Kubernetes(K8S)概述 Kubernetes又称作k8s,是 Google在2014年发布的一个开源项目。 最初Google开发了一个叫 Borg的系统(现在命名为Om…

    数据库 2023年6月6日
    095
  • html学习笔记

    学完html基本以后,现在对html知识做以下总结: 以上内容来源于bilibiliup狂神说 html html,即超文本标记语言(Hyper Text Markup Langu…

    数据库 2023年6月14日
    089
  • LeetCode 26. 删除有序数组中的重复项

    给你一个 升序排列 的数组nums,请你 原地 删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。 由于在某些语言中不能改变数组的长度,…

    数据库 2023年6月11日
    080
  • 面试题: 字符串转整型 终结者

    随着代码手感增强, 想为这个问题写个终结者系列. 缅怀下曾经的自己. 我们审视下这个问题, 整数字符串转成整数. 那么意味着有效字符仅有 “+-0123456789&#…

    数据库 2023年6月9日
    097
  • English words 930 2022

    low hanging fruit 本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://www.cnblogs.com/ukzq/…

    数据库 2023年6月11日
    0101
  • 【SQL实战】期末考试,如何统计学生成绩

    年关将至,这两天所有小学都进入了期末考试阶段。在考试结束时,有必要清点学生的分数。有趣的是,学校提供的成绩单现在并不直接标明分数,而是一个等级,如优秀、良好、合格、不及格。至少北京…

    数据库 2023年5月24日
    0160
  • 渗透攻防Web篇-深入浅出SQL注入

    1 背景 京东SRC(Security Response Center)收录大量外部白帽子提交的sql注入漏洞,漏洞发生的原因多为sql语句拼接和Mybatis使用不当导致。 2 …

    数据库 2023年5月24日
    0105
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球