实战:MySQL Sending data导致查询很慢的问题详细分析

2023-05-16

这两天帮忙定位一个mysql查询很慢的问题,定位过程综合各种方法、理论、工具,很有代表性,分享给大家作为新年礼物:)


【问题现象】

使用sphinx支持倒排索引,但sphinx从mysql查询源数据的时候,查询的记录数才几万条,但查询的速度非常慢,大概要4~5分钟左右


【处理过程】

1)explain

首先怀疑索引没有建好,于是使用explain查看查询计划,结果如下:


从explain的结果来看,整个语句的索引设计是没有问题的,除了第一个表因为业务需要进行整表扫描外,其它的表都是通过索引访问


2)show processlist;

explain看不出问题,那到底慢在哪里呢?

于是想到了使用 show processlist查看sql语句执行状态,查询结果如下:


发现很长一段时间,查询都处在 “Sending data”状态

查询一下“Sending data”状态的含义,原来这个状态的名称很具有误导性,所谓的“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。

这里的关键是为什么要收集数据,原因在于:mysql使用“索引”完成查询结束后,mysql得到了一堆的行id,如果有的列并不在索引中,mysql需要重新到“数据行”上将需要返回的数据读取出来返回个客户端。


3)show profile

为了进一步验证查询的时间分布,于是使用了show profile命令来查看详细的时间分布

首先打开配置:set profiling=on;
执行完查询后,使用show profiles查看query id;
使用show profile for query query_id查看详细信息;

结果如下:


从结果可以看出,Sending data的状态执行了216s


4)排查对比

经过以上步骤,已经确定查询慢是因为大量的时间耗费在了Sending data状态上,结合Sending data的定义,将目标聚焦在查询语句的返回列上面

经过一 一排查,最后定为到一个description的列上,这个列的设计为:`description`varchar(8000) DEFAULT NULL COMMENT '游戏描述',

于是采取了对比的方法,看看“不返回description的结果”如何。show profile的结果如下:


可以看出,不返回description的时候,查询时间只需要15s,返回的时候,需要216s,两者相差15倍


【原理研究】

至此问题已经明确,但原理上我们还需要继续探究。

这篇淘宝的文章很好的解释了相关原理:innodb使用大字段text,blob的一些优化建议

这里的关键信息是:当Innodb的存储格式是 ROW_FORMAT=COMPACT (or ROW_FORMAT=REDUNDANT)的时候,Innodb只会存储前768字节的长度,剩余的数据存放到“溢出页”中

我们使用show table status来查看表的相关信息:


可以看到,平均一行大约1.5K,也就说大约1/10行会使用“溢出存储”,一旦采用了这种方式存储,返回数据的时候本来是顺序读取的数据,就变成了随机读取了,所以导致性能急剧下降。


另外,在测试过程中还发现,无论这条语句执行多少次,甚至将整个表select *几次,语句的执行速度都没有明显变化。这个表的数据和索引加起来才150M左右,而整个Innodb buffer pool有5G,缓存整张表绰绰有余,如果缓存了溢出页,性能应该大幅提高才对。

但实测结果却并没有提高,因此从这个测试可以推论Innodb并没有将溢出页(overflow page)缓存到内存里面

这样的设计也是符合逻辑的,因为overflow page本来就是存放大数据的,如果也放在缓存里面,就会出现一次大数据列(blob、text、varchar)查询,可能就将所有的缓存都更新了,这样会导致其它普通的查询性能急剧下降。


【解决方法】

找到了问题的根本原因,解决方法也就不难了。有几种方法:

1)查询时去掉description的查询,但这受限于业务的实现,可能需要业务做较大调整

2)表结构优化,将descripion拆分到另外的表,这个改动较大,需要已有业务配合修改,且如果业务还是要继续查询这个description的信息,则优化后的性能也不会有很大提升。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实战:MySQL Sending data导致查询很慢的问题详细分析 的相关文章

  • ROS-----pluginlib使用总结

    1 简介 pluginlib是一个C 43 43 库 xff0c 可以实现为一个ROS包动态的加载和卸载插件 这里的插件通常是一些功能类 xff0c 且以运行时可动态加载的库 xff08 如共享对象 xff0c 动态链接库 xff09 的形
  • sumo生成随机车流

    在安装好sumo后 xff0c 生成模拟道路及模拟随机车辆 xff1a 主要参考链接 xff1a https blog csdn net qq 44045364 article details 102912041 以下对于该链接的内容进行一
  • 49天精通Java,第11天,java接口和抽象类的异同,default关键字

    目录 一 什么是接口 二 接口的特点 三 接口和类的区别 四 接口和抽象类的区别 五 接口的声明方式 六 default默认方法 大家好 我是哪吒 一 什么是接口 Java接口是一系列方法的声明 是一些方法特征的集合 一个接口只有方法的特征
  • 解决150%分辨率下拉框错位和echarts鼠标移入焦点错位的问题

    解决150 分辨率下拉框错位和echarts鼠标移入焦点错位的问题 当我们在前端开发的过程中 xff0c 可能会被要求适配主流分辨率 当我们把电脑分辨率调成150 的时候 xff0c 一些下拉框会发生错位现象 xff0c echarts图标
  • 互联网公司面试五大禁忌

    互联网这几年成为求职者追求的热门行业 xff0c 薪水也是水涨船高 xff0c 想要进入这个行业的人也是越来越多了 xff0c 本文给大家讲述一下互联网公司面试的五大禁忌 一 互联网公司HR最不想听到的离职原因 1 无意中泄漏公司机密而被辞
  • 真实面试经历:十面阿里,七面头条,六个Offer

    这是一篇很好的面试经验 xff0c 转载过来 xff0c 希望各位小伙伴可以借鉴 01 面试者背景简介 双非末流一本 xff0c 大三 xff0c CS xff08 计算机科学 xff09 专业 xff0c 有百度实习经历 02 面试情况
  • 程序员之歌:我是一个程序员

    工作一天 xff0c 来一起唱首歌缓解疲劳吧猿媛们
  • 如何准备校招技术面试+一只小菜鸟的面试之路

    校 招一路走来很幸运 xff0c 从最初的迷茫 xff0c 到偶尔的被否认 xff0c 然后慢慢调整心态 xff0c 有缺憾才能有进步 xff0c 正视的自己不足 xff0c 静下心努力提高 xff0c 勇敢尝试各种面试机会 xff0c 因
  • 获取对象属性值的两种方式

    获取对象属性值的方式有两种 xff1a 点 括号 span class token keyword let span obj span class token operator 61 span span class token punctu
  • 5 分钟,教你用 Docker 部署一个 Python 应用!

    在使用传统物理机或云服务器上部署项目都会存在一些痛点 比如 xff1a 项目部署速度慢 资源浪费 迁移难且扩展低 而使用 Docker 部署项目的优势包含 xff1a 高效利用系统资源 服务启动更快 环境一致 xff0c 迁移更加方便 本篇
  • nginx SSL证书

    SSL证书 什么是SSL证书 SSL xff08 Secure Sockets Layer xff09 证书是数字证书的一种 xff0c 类似于驾驶证 护照和营业执照的电子副本 因为配置在服务器上 xff0c 也称为SSL服务器证书 SSL
  • NX搭载Wecat载版SD卡

    写这篇文章原因是 xff1a 1是看官网的文档太长了 xff0c 二是确实想偷懒直接csdn登陆然后复制粘贴就好了 xff0c 三是文档确实很多坑 xff0c 四是实验室刷机电脑跑着个人实在是苔藓了 xff0c 别人盯着有不太好意思玩电脑
  • ROS学习第五天 ROS常用的组件库(一)——TF

    题外话 xff1a 首先给大家道个歉 xff0c 因为之前迷上了无人驾驶apollo仿真 xff0c 花了一段时间研究 后来发现没有资源 xff0c 没有设备 xff0c 是真的难学 xff0c 所以放弃了apollo 最近又到了开题答辩时
  • mysql数据库基础知识,mysql数据库简介(一看就懂,一学就会)

    目录 一 MySQL学习路线二 MySQL常见操作1 查看所有数据库show databases 2 MySQL 创建数据库3 删除数据库4 选择数据库use databasename5 查看该数据库下所有表show tables6 创建数
  • 账号和权限管理

    用户 xff1a 超级用户 xff1a uid gid为0 xff0c 超级用户是系统管理员 xff0c 具备系统最高权限 程序用户 xff1a 每个程序在创建时会自动创建一个程序用户 xff0c uid gid为1到999 xff0c 一
  • 科班程序员逆袭为渗透测试工程师的坎坷路(第一篇)

    渗透测试工程师 1 什么是渗透测试 渗透测试 xff08 penetration test xff09 事实上并没有一个标准的定义 xff0c 在国外的大部分安全组织达成的统一说法是 xff1a 渗透测试是通过模拟恶意黑客的攻击方法 xff
  • 《对抗攻击与防御分类方法综述》阅读笔记20220401

    对抗攻击与防御分类方法综述 A Review of Adversarial Attack and Defense for Classification Methods DOI 10 1080 00031305 2021 2006781 文章
  • Docker Desktop功能讲解

    2013 年发布至今 xff0c Docker 一直广受瞩目 xff0c 被认为可能会改变软件行业 概述 许多人并不清楚 Docker 到底是什么 xff0c 要解决什么问题 xff0c 好处又在哪里 xff1f 本文就来详细解释 xff0
  • rman备份报RMAN-00571、RMAN-00569、RMAN-03009

    rman备份时报错信息 xff1a RMAN 03009 failure of backup command on ORA DISK 1 channel at 07 03 2012 10 35 17 ORA 19809 limit exce
  • Scrapy-自动爬虫

    在前面几篇博文当中 xff0c 我们使用Scrapy框架编写的爬虫项目 xff0c 只能爬取起始网址中设置的网页 有时候 xff0c 我们需要让爬虫持续不断的自动爬取多个网页 xff0c 此时 xff0c 我们需要编写自动爬取网页的爬虫 在

随机推荐

  • Scrapy-连接数据库

    通过前面几篇文章的学习 xff0c 我们已经能够使用Scrapy框架写出一些常见的网络爬虫 在本章中 xff0c 我们将使用Scrapy框架 xff0c 将爬取到的数据存储到数据库中 与将数据写入文件一样 xff0c 写入到数据库中也是通过
  • Scrapy-请求和响应

    Scrapy使用Request和Response对象来爬行网站 通常 xff0c Request对象是在爬虫中生成的 xff0c 并在整个系统中传递 xff0c 直到它们到达下载器 xff0c 后者执行请求并返回一个Response对象 x
  • MySQL ERROR 1698 (28000) 错误

    之前MySQL服务端本机上使用密码登陆root账号是没有问题的 xff0c 但是今天不知道是因为动了哪里 xff0c 登陆失败并有这个错误代码 xff1a mysql u root p Enter password ERROR 1698 2
  • Gunicorn-配置详解

    在之前的文章中有记录WSGI容器的作用 xff0c 以及我们知道常见的容器就只有的uWSGI和Gunicorn xff0c 在之前的文章中有记录他们的特性及优缺点 xff0c 在这就不在多做描述 接下来将着重记录一下Gunicorn的一些配
  • YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

    目录 一 EfficientNet骨干网络1 EfficientNet架构2 EfficientNet在目标检测中的应用3 EfficientNet分辨率的缩放4 EfficientNet深度与宽度的缩放 二 YOLOv7结构1 YOLOv
  • Python-获取图片的大小

    了解过Pillow的都知道 xff0c Pillow是一个非常强大的图片处理器 xff0c 这篇文章主要记录一下Pillow对图片信息的获取 xff1a 安装Pillow pip span class hljs keyword instal
  • lsnrctl command not found

    在linux安装完oracle时 当你遇到lsnrctl command not found等问题都不能用时 会有几种情况 1 首先你先查看下环境变量里面有没有加入oracle的配置 执行 echo ORACLE HOME 没有的话 你执行
  • Ubuntu 18.04-安装图文教程

    Ubuntu xff08 友帮拓 优般图 乌班图 xff09 是一个以桌面应用为主的开源GNU Linux操作系统 xff0c Ubuntu 是基于Debian GNU Linux xff0c 支持x86 amd64 xff08 即x64
  • Docker-DockerFile的使用

    在使用DockerFile定制镜像之前 xff0c 我们先来了解一下镜像的构成 xff1a 镜像是容器的基础 xff0c 每次执行docker run命令的时候都会指定哪个镜像作为容器运行的基础 在之前的栗子中 xff0c 我们使用的镜像都
  • Python-标准库calendar的使用

    此模块允许你输出类似Unix cal程序的日历 xff0c 并提供与日历相关的其他有用功能 值得注意的是 xff0c 默认情况下 xff0c 这些日历将星期一作为一周的第一天 xff0c 将星期日作为一周的最后一天 欧洲惯例 不过 xff0
  • Docker MySql报2059错误: Authentication plugin 'caching_sha2_password' cannot be loaded

    最近在使用Docker安装和配置MySql xff0c 按照正常的步骤来安装和配置MySQL xff0c 可配置完成后登录MySQL客户端出现了2059错误 xff0c 于是上各种博客 技术论坛寻求相关的问题解决办法 xff0c 可是仍然找
  • 套接字与文件

    在Linux中 xff0c 所有套接字都是文件 xff0c 操作系统并不区分套接字和文件 xff0c 因此对二者可以使用相同的读写函数
  • MySQL中find_in_set函数的使用

    1 语法 FIND IN SET str strlist xff08 1 xff09 str 要查询的字符串 xff08 2 xff09 strlist 字段名 xff1b 参数以 分隔 如 1 2 6 8 查询字段 strlist 中包含
  • C文件创建并写入文件

    创建并写入文件 u003Cstdio h gt nint main n n t 创建一个名为data txt的文件 n tFILE pFile 61 fopen 34 data txt 34 34 w 34 n tif pFile 61 6
  • 关于海康摄像头的摘要认证

    最近在做一个项目时候要用到摄像头人脸抓拍 xff0c 人脸识别等功能 xff0c 原本使用海康的SDK就可以解决的 xff0c 但是我们项目是在arm平台下开发的 xff0c 而海康的SDK不支持arm平台 xff0c 无奈联系的海康的技术
  • 华为OD机试真题2023(JAVA)

    目录 华为OD机试是什么 xff1f 华为OD面试流程 xff1f 华为OD机试通过率高吗 xff1f 华为OD薪资待遇 xff1f 华为OD晋升空间 xff1f 大家好 xff0c 我是哪吒 本专栏包含了最新最全的华为OD机试真题 xff
  • ARM的快速上下文切换(FCSE)

    一 FCSE的原理 通常情况下 xff0c 如果两个进程占用的虚拟地址空间由重叠 xff0c 系统在这两个进程之间进行切换时 xff0c 必须进行虚拟地址到物理地址的重映射 而虚拟地址到物理地址的重映射涉及到重建MMU中的页表 xff0c
  • 使用PyQt5/PySide2编写一个极简的音乐播放器

    文章目录 一 创建UI界面二 获取网络歌曲三 创建和链接信号槽 疫情肆虐 xff0c 憋在家实在无聊 xff0c 索性写点东西 xff0c 于是就有了这个极极极极极简的音乐播放器 这个极极极简的音乐播放器类似于 阅后即焚 的软件 xff0c
  • Android zxing二维码扫描 扫描框适应各种分辨率

    public synchronized Rect getFramingRect if framingRect 61 61 null if camera 61 61 null return null Point screenResolutio
  • 实战:MySQL Sending data导致查询很慢的问题详细分析

    这两天帮忙定位一个mysql查询很慢的问题 xff0c 定位过程综合各种方法 理论 工具 xff0c 很有代表性 xff0c 分享给大家作为新年礼物 xff1a xff09 问题现象 使用sphinx支持倒排索引 xff0c 但sphinx