MySql查询的生命周期和性能优化思路

news2025/1/12 0:50:12

目录

前言

1. 为什么查询性能差

2. 一次查询的生命周期

2.1 客户端与服务端通信

2.2 查询缓存

2.3 解析器

2.4 预处理器

2.5 优化器

2.6 查询引擎

2.7 存储引擎

3. 查询性能优化的思路

4.总结


前言

        一说到mysql的查询性能优化,相信很多人能说出来很多的技巧和方法,如建索引、尽量不要用select *、join不要超过3张表等等,网上有很多的文章都是类似这样的技巧和方法,这些技巧有用吗?确实有用,但是分情况,不是什么情况下都适用的。另外,我认为业务场景比较复杂的时候,硬搬技巧并非明智之举。因此,我想通过这篇文章分享一下mysql查询性能优化的思路,而不是技巧。

        选择正确的处理mysql查询性能问题的思路,再根据实际情况选择合适的技巧,这就是我想与大家分享的关键。

1. 为什么查询性能差

        我们都知道这样一个事实,一个高性能的查询,离不开合理的表结构设计、合理的索引结构设计、合理的查询sql设计。通常情况下,收到运维关于慢sql的反馈时,表结构的设计已经完成,且轻易不能去改动,否则可能会对业务产生影响,可以做的优化思路就是从索引、查询语句本身这两个方面展开。

        所谓的查询性能差,实质是指客户端发出一个sql查询请求,到服务端完成响应的所消耗的时间比较长。那么如果优化查询性能,就有必要了解清楚从客户端发出sql请求到服务端完成查询结果响应的生命周期里都经历了哪些过程?每个过程都做了哪些任务?在执行任务的规则是什么?优化查询的主要思路就是查询语句本身应该尽可能的适配这些规则,这些任务才能被高效的完成,查询的性能才能变理更好。

2. 一次查询的生命周期

        1.sql通过网络通信协议,从客户端发磅到服务端。

        2.服务端收到sql后,查询缓存是否有匹配结果,若存在缓存,则直接取出缓存中结果返回,

        否则进行下一阶段。

        3.服务端对sql进行解析、预处理,然后生成查询计划。

        4.执行引擎根据优化器生成的查询计划,调用存储引擎的API接口,拿到查询结果,然后返回

        给客户端,同是缓存查询结果,不过缓存查询结果需要手动配置才会生效。

2.1 客户端与服务端通信

        mysql客户端与服务端的通信协议是半双工的,意味着任何一个时刻,要么是客户端在向服务端发送请求数据,要么就是服务端在向客户端发送响应数据,这两个动作不能同时发生。

2.2 查询缓存

        如果查询缓存的配置是打开,服务端收到sql后,会先查询缓存是否要命中。如果命中缓存,则校验完权限,不需要解析sql就可以从缓存中取出结果返回给客户端。

2.3 解析器

        通过msyql的关键字将sql语句解析成一颗“解析树”,使用mysql的语法规则验证和解析查询,如验证是否有错误的关键字、关键字的顺序是否正确等

2.4 预处理器

        预处理器根据mysql的一些规则进一步检查解析树是否合法,如表、数据列是否存在、表名和别名是否有歧义、是否拥有相应的权限配置

2.5 优化器

        基于成本分析生成一个查询计划,所谓成本分析是指mysql本身会基于配置和一些统计信息,找到执行这条查询最好的执行计划。这个过程是非常复杂的,也是科学严谨的,所以大多数时候,基于成本分析生成的查询计划就是最好的。前一篇文章《使用mysql-explain 查询sql执行计划,你会用了吗》的主要内容就是如何通过explain命令查看解读优化器生成的查询计划,这对于查询性能的优化很帮助。千万不要遇到一个慢sql,上来就各种技巧一阵应用,结果发现没什么效果,就尴尬了。

2.6 查询引擎

        查询引擎的作用就是根据优化器生的查询计划,调用存储引擎的接口,去拿数据。

2.7 存储引擎

        存储引擎的作用主要就是存储数据和对外提供交互接口来提取、存储数据。

3. 查询性能优化的思路

        梳理清楚一次查询的生命周期,会发现查询性能优化可以做的有两个地方:

        1.客户端与服务端通信的过程

        因为客户端与服务的通信协议是半双工,同一时刻要么发,要么收,不能同时收发,如果发送的数据包很长,效率就会比较差。所以这个过程的优化思路,让客户端与服务端之间的传递的数据包尽可能小一些。

        客户端发送到服务端的比较复杂、体量比较大的查询sql可以切割的小一些,相对小一些的sql除了效率更高,命中缓存的概率也大。

        客户端避免向服务端请求一些不需要的数据,即在sql里请求了这些数据,但是应用程序里丢掉了。比较典型的就是总是取出全部列、多表关联时返回全部列。检索了超过实际需要的数据行和列,会产生额外的负担、增加开销。

        2.优化器生成查询计划的过程

        使用explain对查询语句分析查询计划,查看sql匹配索引的情况、数据扫描的行数情况。索引的本质是让mysql以最高效、扫描行数最少的方式找到需要的记录,所以查询性能优化的关键还是在于尽可能的匹配上索引。网上很多文章中介绍的技巧,大部分都是基于此。

        explain输出的信息列中的rows表示MySQL根据表统计信息及索引选用情况,估算找到所需的记录所需要扫描读取的行数,filtered表示按条件过滤后剩余的行数,即实际返回客户端的行数,占实际为得到结果扫描的数据行数的百分比。因此除了索引之外,尽可能扫描少的行数就能得到想要的结果,意味着更少的cpu操作、内存操作、IO操作。

4.总结

        技巧是死的,方法是活的,在早期的msyql版本中,存在一些问题,对应有一些技巧能解决,但是随着版本的迭代,一些问题被解决、结构被优化,如果还在用所谓的技巧,有可能适得其反。实践是检验真理的唯一标准,如果查询性能有问题,那就先分析问题,找到原因,对症下药,切不可病急乱投医。

        因此explain是一个好东西,建议仔细研究。再举个例子,下面sql是查询学生分数,当需要扫描的行数比较多的时候,即便score(分数)创建的有索引,mysql的执行计划会放弃索引,直接进行全表扫描。当需要扫描较少的行数的时候,索引才会起作用。所以,如果不分析问题,直接创建索引未必就能解决性能问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AT32F407/437使用FreeRTOS并实现ping客户端

示例目的 基于以太网络,实现ping客户端已检测网络联机。 支持型号 AT32F407xx AT32F437xx 主要使用外设 EMAC GPIO USART 快速使用方法硬件资源 1) 指示灯LED2/LED3 2) USART1(PA9/PA10) 3) AT-START-F407/ AT-START-F437实验板 4) 以太网连接线软件资源 1) SourceC…

sql函数coalesce和parse_url

学习函数系列: coalesce coalesce函数可以用来排除null值。 coalesce(a, b,c,d) 参数的个数没有限制 返回第一个参数中非null的值。 select help coalesce\G; [ 1. row ] name | COALESCE description | Syntax: COALESCE(value,…) Returns the first non-NUL…

15-JavaSE基础巩固练习:多态、接口、抽象类的综合练习

多态的综合练习 1、需求 狗类 属性:年龄,颜色行为: eat(String something):表示吃东西lookHome():看家 猫类 属性:年龄,颜色行为: eat(String something):吃东西catch…

5G工业互联阶段二:5G产线工控网

5G深入核心生产环节的第二个阶段,主要是实现产线内部通信5G化。以工控5G化为主,并综合考虑数采、安全通信等。大致示意如下: 工艺部件工控通信5G化: 如上图所述,以产线主PLC为中心,大致分为主PLC到产线内机…

Spark 3.0 - 5.ML Pipeline 实战之电影影评情感分析

目录 一.引言 二.Stage1 - 数据准备 1.数据样式 2.读取数据 3.平均得分与 Top 5 4.训练集、测试集划分 三.Stage-2 - Comment 分词 1.Tokenizer 🙅🏻‍♀️ 2.JieBa 分词 🙆🏻‍♀️ 2.1 Jieba 分词示例 2.2 自定义 Jie…

系统设计 system design 干货笔记

参考大佬的博客 https://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache 参考的github https://github.com/donnemartin/system-design-primer#step-2-review-the-scalability-article scalability 1 Clone 每台服务器都包含完全相同的代码库&#…

SOLIDWORKS 2023 3D Creator 云端结构设计新功能

3DEXPERIENCE平台更新版本已经与大家见面,今天微辰三维与大家分享3D Creator 云端结构设计新功能,让我们先一起来看看视频—— SOLIDWORKS 2023 3D 云端结构设计新功能点击观看3D Creator 云端结构设计新功能 如今,我们的设计生产工作不仅要面…

Linux进阶-Makefile

make工具:找出修改过的文件,根据依赖关系,找出受影响的相关文件,最后按照规则单独编译这些文件。 Makefile文件:记录依赖关系和编译规则。 Makefile本质:无论多么复杂的语法,都是为了更好地解决…

m认知无线电网络中频谱感知的按需路由算法matlab仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 使用无线电用户的频率范围在 9kHz 到 275GHz[3],由于无线通信环境中的干扰、信道衰落和无线电收发设备自身属性等的影响,大部分无线电设备只能工作在 50GHz 以下。…

融媒体解决方案-最新全套文件

融媒体解决方案-最新全套文件一、建设背景二、建设思路三、建设方案二、获取 - 融媒体全套最新解决方案合集一、建设背景 随着互联网的快速发展,社会已步入全媒体时代,各媒体机构积极探索传统媒体转型之路。 为巩固壮大主流思想舆论,不断提…

对数的应用:放缩x轴或者y轴以更好地表达函数的结果

对数尺度的作用 yAxnyAx^nyAxn 在实验中 AAA 和 nnn 都是未知数,现在我想求出 AAA 和 nnn假设 n1.5,A1n1.5, A1n1.5,A1,那么我们可以做个图看看 x np.linspace(1,10,10) y 1 * x**3 plt.plot(y)如果我做实验恰好得到一些点,那么我很难知道…

【全志T113-S3_100ask】14-1 linux采集usb摄像头实现拍照(FFmpeg、fswebcam)

【全志T113-S3_100ask】14-1 linux采集usb摄像头实现拍照背景(一)FFmpeg1、简介:2、交叉编译FFmpeg3、测试(二)fswebcam1、背景2、交叉编译fswebcam3、测试背景 在开发板上有一个csi转dvp接口的摄像头,但是…

前端入门到放弃(VUE、ES6,简单到不得了)

VSCode 使用 1、安装常用插件 切换到插件标签页 安装一下基本插件 2、创建项目 vscode 很轻量级,本身没有新建项目的选项,创建一个空文件夹就可以当做一个项目 3、创建网页 创建文件,命名为 index.html 快捷键 !快速创建网页模板 h1 回…

精益管理学会|什么是ECRS改善方法?

ECRS是IE工程改善、精益生產管理改善的四大法宝。 针对现有的生产线进行改善时,常见的做法是对现有的生产线进行绘制各工站的工时山积表如下圖所見,然后对各工站的动作单元进行ECRS 改善。 E:不需要的可进行 Eliminate (取消&…

Telegraf-Influxdb-Grafana容器化部署拓展(Https、AD域、告警集成)并监控Cisco设备指标

前言: 还记得在去年的笔记中提到过使用python的pysnmp模块,配合Influxdb,Grafana收集Cisco设备指标。链接如下:https://blog.csdn.net/tushanpeipei/article/details/117329794 。在该实例中,我们通过python编写脚本收…

第一节 Maven核心程序解压与配置

1、Maven 官网地址 首页: Maven – Maven Repositories (apache.org)https://maven.apache.org/repositories/index.html下载页面: Maven – Download Apache Mavenhttps://maven.apache.org/download.cgi下载链接: 具体下载地址&#xff…

【微信小程序】列表渲染wx:for

&#x1f3c6;今日学习目标&#xff1a;第十二期——列表渲染wx:for &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;20分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 文章目录前言效果图< block…

同花顺_代码解析_交易系统_J01_08

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 J_01 MACD系统 J_02 布林带系统 J_03 趋向指标 J_04 乖离系统 J_05 KDJ系统 J_07 容量比率系统 J_08 威廉系统 J_01 MACD系统 分析MACD柱状线&#xff0c;由绿变红(负变正)&…

Bootstrap实例(四)

目录&#xff1a; &#xff08;1&#xff09;bootstrtap实例&#xff08;轮廓&#xff09; &#xff08;2&#xff09;bootstrap三列布局 &#xff08;3&#xff09;bootstrap&#xff08;标签页&#xff09; &#xff08;4&#xff09;bootstrap&#xff08;end&#xff0…

56.Django的admin后台管理使用方法

准备 Django框架提供了一个自动化后台管理功能&#xff0c;对网站数据的后台维护&#xff0c;仅仅需要进行非常简单的配置和编写极少的代码即可实现。 首先创建一个Django项目admin_study&#xff0c;然后创建连接数据库&#xff0c;在数据库中创建好表数据库后&#xff0c;进…