MySQL查询原理与优化

news2024/11/16 18:42:59

文章目录

  • 前言
  • 执行查询的过程逻辑
    • 连接器
    • 查询缓存
    • 解析器
    • 优化器
    • 执行器
  • 衡量查询开销的三个指标
    • 响应时间
    • 扫描行数
    • 返回的行数
  • 重构查询的几种选择
    • 一个复杂的查询还是多个简单的查询
    • 切分查询
    • 关联查询
    • 解决关联查询的原则
  • 总结

前言

上一篇文章中(MySQL索引全解:从理论到实践,打造高效查询的指南),详细介绍了索引相关的内容,理解这部分知识对于实现高性能的查询来说必不可少,但这并不是全部,你还需要了解MySQL的查询流程,以及一些其他相关的查询机制,这样才能确保你不会写出一些性能糟糕的查询语句。

所以,本篇文章就针对MySQL查询相关的内容进行介绍,包含:执行查询的过程、查询消耗的关键指标、查询的优化等,通过这些内容希望能够帮助你明白一些执行较慢的查询产生的原因,以及如何才能避开它们。

执行查询的过程逻辑

下图展示了MySQL执行查询的大致过程逻辑。
image.png

了解这张图,将有助于你理解MySQL服务器的,总体来说,MySQL服务器可以分为两层:服务层和存储引擎层。

服务层包含了连接器、查询缓存、解析器、优化器、执行器以及所有内置函数、存储过程、触发器、视图等。

而存储引擎层主要就是负责数据的存储与查询,并且支持以插件形式进行替换,服务器通过存储引擎API进行交互,这些API屏蔽了不同存储引擎之间的差异,存储引擎通常只需包含少量的底层函数,然后通过一些组合即可满足各种查询需求,比如获取第一行数据,获取下一行数据,通过这两个API即可实现查询所有数据的功能,目前最常用的存储引擎就是InnoDB

连接器

连接器主要负责服务端与客户端建立连接、管理连接等,一旦连接建立完成,在服务端就会产生一个空闲连接,如果用show processlist查看,就会显示为sleep

如果超过wait_timeout时间都没有请求的话,连接器就会断开这个连接。

查询缓存

查询缓存用处不大,现在基本上客户端都会自己进行缓存,所以MySQL8.0版本中也已经删除了此功能。

解析器

解析器主要用来检查查询语句,对语法进行分析,检查表、字段是否存在等情况。

优化器

到了优化器就负责对执行计划的生成了,优化器会决定使用哪个索引,采用哪种join方式以及其他非常多的优化技巧。

执行器

最后,执行器就会根据优化器生成的执行计划,调用存储引擎的接口,大致流程就是取一行,然后判断是否符合条件,符合就存下来,不符合就跳过,然后继续取下一行,直到取到最后一行为止,然后将结果集返回给客户端。

衡量查询开销的三个指标

知道查询的消耗有哪些,将更有助于我们理解查询优化的方式以及设计,一般来说衡量查询开销的指标主要有如下三个:响应时间、扫描行数、返回的行数。

响应时间

响应时间包含又服务时间和排队时间,服务时间指的是执行查询真正花费的时间,而排队时间指的是服务器因为等待I/O资源、锁等资源时消耗的时间,两部分时间加起来则是一次请求所需要的全部时间,而这个时间通常是需要我们能大致判断出来的。

扫描行数

扫描行数是判断一个查询效率是否足够高的一个重要指标,从一定程度上来讲扫描行数越多查询也就越慢。

扫描的数据页多少也能反映出扫描行数的多少
image.png

对比主键查询
image.png

返回的行数

最完美的情况当然是,扫描的行数等于返回的行数,也就是要什么就查什么,但很遗憾,大多数情况下扫描行数与返回的行数的比例大约在1:110:1之间。

重构查询的几种选择

结合查询消耗的关键指标来分析,重构查询的目的就在于采取一些手段来尽量减少这些指标的消耗。

一个复杂的查询还是多个简单的查询

考虑到现在网络连接的速度以及连接池等手段,发起多次小而快的查询已经不是什么严重的问题了,言外之意就是如果能将一个复杂的查询拆分为几个简单的小查询,那也是不错的选择,这样拆分出来的逻辑,常常还可以通过其他方式进一步优化,比如join查询被拆分后,单张表的结果就可以被缓存起来,因此,你应该好好评估一下是否可以这样做。

切分查询

切分查询的目的是为了避免一次性产生过多的资源消耗,比如一次性要删除非常多的数据,这将会造成锁数据的范围非常大、事务日志的写入非常多,这些都会带来大量的线程排队等待的消耗。通常我们的建议是将一次大的操作,拆分为多次小的操作,分批完成。

关联查询

关联查询在日常满足业务需求中是非常常见的查询方式,同时也经常是造成慢查询的主要原因,MySQL其实也针对关联查询做了很多优化,尽量的提高其查询效率,但有些情况MySQL也并不能直接来进行查询重构,还是需要使用者有意识的做出一些调整才能命中到事先设计好的一些优化方式中,所以,接下来,让我们了解一下关联查询的一些查询设计吧!

如何完成一次关联查询?

首先,先了解一下关联查询是如何实现的,比如如下的一条查询语句:select b.* from a inner join b on a.id = b.id where a.col in (1, 2);

要实现关联查询,在代码逻辑上来说,本质就是嵌套循环的查询,下面是一段伪代码逻辑,大致表现出了处理的逻辑:

for each row in t1 matching range {
  for each row in t2 matching reference key {
    for each row in t3 {
      if row satisfies join conditions, send to client
    }
  }
}

既然是嵌套循环,那就可以考虑是不是尽力让小循环嵌套大循环更好一点,毕竟内层循环如果是利用索引查找,时间复杂度是较低的。

下面这个案例可以很好的体现这一点,t_user_1表的数据比t_user_2表的数据要多。
image.png

加上straight join关键字后,可以让MySQL按照指定的顺序做表关联查询。
image.png

所以在做关联查询时,找到合适的关联顺序是非常关键的,但如果关联的表比较多时,MySQL也不可能枚举每一种关联的方式(3张表有6种组合,4张表有24种组合),再决定采取哪一种更合适,当关联表的数量超过optimizer_serach_depth时,就会采用一些贪心的计算策略。

解决关联查询的原则

MySQL针对一些关联查询会采取额外的优化方式,比如我们在执行计划能看到:Index Nested-Loop Join、Block Nested Loop、Index Condition Pushdown等,这些优化的核心思想都是尽量减少磁盘I/O的消耗,尤其是随机磁盘I/O的问题,而解决的方式无非就是把数据尽量一次性加载到内存中来进行过滤,过滤前还可以先将数据排序好,必减少随机访问的问题。所以,本质上任何优化方式都还是在围绕三个关键指标来进行选择。

总结

从上一篇文章MySQL索引全解:从理论到实践,打造高效查询的指南,到本篇的MySQL查询原理与优化,我们已经大致将查询优化从理论支撑到实践方式完整的介绍了一遍,在有了这些知识铺垫之后,下一篇文章实践性将会更强,计划将会整理一些日常开发中常见的实际优化案例进行分享,完成从理论到实践的最后一步。

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

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

相关文章

如何使用python实现邮件全家桶式功能

今天带大家实现一下,不登录邮箱界面 通过python代码实现发送邮件、添加附件、接收邮件的功能。 如下:使用网易126邮箱进行演示。 还可以添加小姐姐的可可爱爱的照片作为附件 ​ 先上效果 一、邮箱端设置 首先,要对邮件进行一下设置&…

【LeetCode:307. 区域和检索 - 数组可修改 | 树状数组 or 线段树】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

设计必备:2023年最值得关注的8个素材网站!

如果你想学好平面设计,模仿和积累材料很重要,今天我们将与您分享一些常见的设计网站和材料下载网站。 1、即时设计 即时设计是专业的 UI 设计在线工具,内置丰富的设计素材,它可以被看作是一个设计素材网站。即时设计拥有来自于 …

SAP ABAP列表格式及表格输出

REPORT YTEST001. DATA wa LIKE spfli. WRITE: /. WRITE: 10航班承运人,40航班连接,60国家代码,80起飞城市,100起飞机场. SELECT * INTO wa FROM spfli.WRITE: / wa-carrid UNDER 航班承运人,wa-connid UNDER 航班连接,wa-countryfr UNDER 国家代码,wa-cityfrom UNDER 起飞城市…

“颠覆·挑战·极致”华瑞指数云ExponTech WDS新一代产品重新定义企业存储和数据架构

数字经济发展,离不开数据这一信息时代的“新能源”。当数据爆发式增长,企业何处寻得一款在性能和成本上皆具备良好表现的“储能仓”?国内数据存储领域领先厂商华瑞指数云ExponTech自主研发的高性能、高可靠的分布式存储产品ExponTech WDS成为…

Spring中Bean实例化方式和Bean生命周期

Spring Bean的实例化方式通过构造方法实例化通过简单工厂模式实例化通过工厂方法模式实例化通过FactoryBean接口实例化 注入自定义DateBean的生命周期Bean的循环依赖问题 Bean的实例化方式 Spring为Bean提供了多种实例化方式,通常包括4种方式。(也就是说…

阿里全系产品崩上了热搜,我是有些失望的

双十一刚刚过,没想到阿里巴巴全系产品却又崩上热搜了。看来阿里的不少程序员同学今天又是在加班中度过了,心疼,希望你们把班加了就可以了,锅就别背了。 据了解,截至目前,本次修复进展如下: 17:…

SCADA系统在化工行业应用解决方案和注意事项

SCADA系统在化工行业的数字化工厂中具有广泛的应用解决方案。SCADA系统通过实时监控和远程控制,帮助化工企业实现生产过程的自动化和数字化管理。以下是化工行业的SCADA系统行业应用中可以解决的客户痛点以及相关的详细设计说明: 远程监测和控制&#xf…

GPON、XG(S)-PON基础

前言 本文主要介绍了GPON、XG(S)-PON中数据复用技术、协议、关键技术、组网保护等内容,希望对你有帮助。 一:GPON数据复用技术 下行波长:1490nm,上行波长:1310nm 1:单线双向传输(WDM技术&am…

JS+ES6新增字符串方法大汇总,爆肝,共四十七种方法(求个赞,哈哈)

让我为大家介绍一下字符串的操作方法吧,你知道与不知道的大部分都在这! 分类可能有点不太对,还请大家见谅! 增 1.concat() 拼接字符串 可以连接两个或多个字符串 let str "hello"let str1 " str"console…

项目管理工具:提高团队协作效率,确保项目按时完成

项目管理对于企业的成功至关重要,一个好的项目管理工具可以提高团队协作效率,确保项目按时完成,并保持项目进度的高效跟踪。 近年来,一款名为“进度猫”的项目管理工具逐渐崭露头角,它以其独特的功能和优势&#xff…

算法细节类错误

1.使用全局变量时,若有多组测试数据 应该注意在循坏中重新初始化全局变量 例如:

【第2章 Node.js基础】2.4 Node.js 全局对象(一)

什么是Node.js 全局对象 对于浏览器引擎来说,JavaScript 脚本中的 window 是全局对象,而Node.js程序中的全局对象是 global,所有全局变量(除global本身外)都是global 对象的属性。全局变量和全局对象是所有模块都可以调用的。Node.is 的全局…

记忆科技携手中国电信,一站式存储打造坚实数字底座

11月10日,以“数字科技 焕新启航”为主题的2023数字科技生态大会在广州盛大开幕,本次大会由中国电信、广东省人民政府联合举办,是一场数字科技领域的年度盛会。忆联母公司记忆科技作为中国电信的合作伙伴之一受邀参会,深度参与了大…

常用的一些LDO芯片及使用稳定的LDO芯片推荐

LDO也是电赛中常用的电源模块。相比DCDC以及稳压器,LDO的跌落电压更小,因此两者适用场合不同。下面介绍一些常用的LDO及其使用: 1. TPS7A4501(正降压) 数据手册:https://www.ti.com.cn/cn/lit/ds/symlink…

【JUC】一、synchronized关键字与Lock接口

文章目录 1、JUC2、进程与线程3、并发与并行4、用户线程和守护线程5、对象锁和类锁6、Synchronized关键字7、synchronized案例8、Lock接口 1、JUC JUC,即java.util.concurrent这个处理线程的工具包,始于JDK1.5,其中下有三个包,为…

华为的干部管理和人才管理实践精髓(深度好文,收藏)

(本文摘自谢宁专著《华为战略管理法:DSTE实战体系》,欢迎购买) 1997年,在《华为基本法》的起草过程中,起草小组的一位人大教授问任正非:“任总,人才是不是华为的核心竞争力?”任正非的回答出人…

阿里三面被虐惨,非让我举例说明,为什么GC需要Stop the World?

最近,五哥回忆起4年前在蚂蚁金服三面的经历。关于GC的一个问题,让我记忆深刻。 当聊起来Java GC时,我提到 young gc 和 full gc都会 Stop the world。 ”为什么需要 Stop the world“,蚂蚁面试官问道。 我略微怔住,…

WH4530A可检测0-100cm环境光+距离检测功能

台湾旺泓推出的WH4530A是一款结合了先进环境光传感器(ALS)先进接近传感器(PS)和高效率的红外LED灯三合一为一体的光距感接近传感器;可测距范围0-100cm;采用I2C接口,可实现超高灵敏度、精准测距检测范围广等…

设备管理软件有什么用?如何让维修工作智能化?

随着数字化和人工智能技术的不断发展,设备管理软件已经成为了一种智能化的管理方式,它能够整合设备设施的维修资源,实现全生命周期的设备设施管理。这种软件可以帮助机构单位更好地跟踪和管理设备设施的维修请求,提高维修效率和管…