MySQL夯实之路-查询性能优化深入浅出

MySQL调优分析

explain;show status查看服务器状态信息

优化

减少子任务,减少子任务执行次数,减少子任务执行时间(优,少,快

查询优化分析方法

1.访问了太多的行和列:确认应用程序是否在检索大量超过需要的数据。这通常意味着访问了太多的行,但有时候也可能是访问了太多的列。
2.分析了太多的数据行:确认 MySQL服务器层是否在分析大量超过需要的数据行。


sql优化

1.减少查询的记录:使用select语句查询大量结果,然后再获取前N行(如新闻网站,取100条记录,只显示前面的10条;取最值),这时可以使用limit(limit 1,10;从1开始10行)

2.减少查询的列:不要总是SELECT *取出全部列,会额外消耗I/O、内存,CPU。

3.重复查询相同的数据:可以将数据缓存起来需要再取出

4.切分查询:有时需要将大查询切分为多个小查询。

删除旧数据:

定期地清除大量数据时,如果用一个大的语句一次性完成的话,则可能需要一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。将一个大的 DELETE语句切分成多个较小的查询可以尽可能小地影响MySQL性能,同时还可以减少MySQL复制的延迟。

 分解关联查询:

查询执行的基础

5.尽量用外连接代替子查询:通过测试来验证

6.尽量不要排序,文件排序很损耗性能,尽量使用索引排序。

7.尽量不要使用in,会导致全表扫描,可以用between

确定了查询只返回需要的数据后,看是否扫描了额外的数据

查询开销

对于MySQL,最简单的衡量查询开销的三个指标如下:
1.响应时间

2.扫描的行数

3.返回的行数
 

 

如果发现查询需要扫描大量的数据但只返回少数的行,那么通常可以尝试下面的技巧去优化它:
1.使用索引覆盖扫描,把所有需要用的列都放到索引中,这样存储引擎无须回表获取对应行就可以返回结果了。
2.改变库表结构。例如使用单独的汇总表。
3.重写这个复杂的查询,让 MySQL优化器能够以更优化的方式执行这个查询。

查询执行的过程

 

查询过程

1.客户端发送一条查询给服务器。
2.服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则
进入下一阶段。
3.服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。

4. MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。

5.将结果返回给客户端。

 

Mysql客服端/服务端通信协议:

“半双工”的,同一时刻只能一方发送数据

查询状态

Show full processlist(返回结果的command列为当前状态)

查询缓存
在解析一个查询语句之前,如果查询缓存是打开的,那么MySQL会优先检查这个查询是否命中查询缓存中的数据。这个检查是通过一个对大小写敏感的哈希查找实现的。查询和缓存中的查询即使只有一个字节不同,那也不会匹配缓存结果#",这种情况下查询就会进入下--阶段的处理。


如果当前的查询恰好命中了查询缓存,那么在返回查询结果之前MySQL会检查一次用户权限。这仍然是无须解析查询SQL语句的,因为在查询缓存中已经存放了当前查询需要访问的表信息。如果权限没有问题,MySQL会跳过所有其他阶段,直接从缓存中拿到结果并返回给客户端。这种情况下,查询不会被解析,不用生成执行计划,不会被执行。

查询优化处理


查询的生命周期的下一步是将一个SQL转推成一个执行计划,MySQL再依照这个执行计划和存储引擎进行交互。这包括多个子阶段:解析SQL、预处理、优化SQL执行计划。这个过程中任何错误(例如语法错误)都可能终止查询。

语法解析器和预处理
首先,MySQL通过关键字将SQL语句进行解析,并生成一棵对应的“解析树”。MySQL解析器将使用MySQL语法规则验证和解析查询。例如,它将验证是否使用错误的关键字,或者使用关键字的顺序是否正确等,再或者它还会验证引号是否能前后正确匹配。
预处理器则根据一些MySQL规则进一步检查解析树是否合法,例如,这里将检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义。
下一步预处理器会验证权限。这通常很快,除非服务器上有非常多的权限配置。 

查询优化器
现在语法树被认为是合法的了,并且由优化器将其转化成执行计划。一条查询可以有很多种执行方式,最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。MySQL使用基于成本的优化器,它将尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。最初,成本的最小单位是随机读取一个4K数据页的成本,后来(成本计算公式)变得更加复杂,并且引入了一些“因子”来估算某些操作的代价,如当执行一次MERE条件比较的成本。可以通过查询当前会话的Last_query_cost的值来得知MySQL计算的当前查询的成本。


 

Mysql能处理的优化类型:

重新定义关联表的顺序,

将外连接转化为内连接,

使用等价变换规则,

优化count,min,max,

预估并转换为常数表达式,

覆盖索引扫描,

子查询优化

提前终止查询

等值传播

列表in()的比较

执行关联查询

当前MySQL关联执行的策略很简单:MySQL对任何关联都执行嵌套循环关联操作,即MySQL先在一个表中循环取出单条数据,然后再嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。MySQL会尝试在最后一个关联表中找到所有匹配的行,如果最后一个关联表无法找到更多的行以后,MySQL返回到上一层次关联表,看是否能够找到更多的匹配记录,依此类推迭代执行。

关于MylSAM的神话


MyISAM的COUNT()函数总是非常快,不过这是有前提条件的,即只有没有任何WHERE条件的COUNT(*)才非常快,因为此时无须实际地去计算表的行数。MySQL可以利用存储引擎的特性直接获得这个值。如果 MySQL 知道某列col不可能为NULL值,那么MySQL内部会将COUNT(col)表达式优化为COUNT(*)。
 

 

优化关联查询

   

使用用户自定义变量

                 

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

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

相关文章

pytorch学习笔记(十)

一、损失函数 举个例子 比如说根据Loss提供的信息知道,解答题太弱了,需要多训练训练这个模块。 Loss作用:1.算实际输出和目标之间的差距 2.为我们更新输出提供一定的依据(反向传播) 看官方文档 每个输入输出相减取…

数据库-列的类型-字符串char类型

char 和 varchar 类型 char 类型懂得都懂就是固定的字符串类型 char (maxLen) 例如 char(5) 这个长度为5 但插入数据‘a’时 是5 插入abc 也是5 即使插满固定 就像C/C语言里 char 字符数组一样 char str[64]; maxLen255 哈哈最多有255个字符多了我认为你是错误 varchar…

C++(9)——内存管理

1. 内存分类: 在前面的文章中,通常会涉及到几个名词,例如:栈、堆。这两个词所代表的便是计算机内存的一部分 。在计算机中,对系统的内存按照不同的使用需求进行了区分,大致可以分为:栈 、堆、数…

Pandas实战100例 | 案例 30: 应用自定义函数

案例 30: 应用自定义函数 知识点讲解 在数据处理过程中,有时需要对数据应用特定的逻辑,这时可以使用自定义函数。Pandas 的 apply 方法允许你对 DataFrame 的行或列应用一个自定义函数。 自定义函数: 你可以定义一个 Python 函数,该函数可…

Debezium发布历史63

原文地址: https://debezium.io/blog/2019/07/08/tutorial-sentry-debezium-container-images/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. 将 Sentry 添加到 Debezium 容器镜像的教程 2019 年 7…

安卓11菜单实现hdmi-4K动态切换

客户要求系统实现动态hdmi-4K与普通分辨率直接热切换,先在菜单中做个试验,设置中加个切换开关,点击开关就可以直接切到hdmi-4K,这个功能实现后可以通过插拔hdmi那个状态(sys/class/drm/card0-HDMI-A-1/status&#xff…

41k+ stars 闪电般快速的开源搜索引擎 docker安装教程

目录 1.下载 2.启动 成功示例 3.创建索引 4.插入数据 4.1下载数据 4.2插入数据 4.3查看数据 5.官方地址 1.下载 docker pull getmeili/meilisearch:latest 2.启动 mkdir -p /opt/meili_datadocker run -it --rm \-p 7700:7700 \-v /opt/meili_data:/meili_data \ge…

YOLOV7剪枝流程

YOLOV7剪枝流程 1、训练 1)划分数据集进行训练前的准备,按正常的划分流程即可 2)修改train.py文件 第一次处在参数列表里添加剪枝的参数,正常训练时设置为False,剪枝后微调时设置为True parser.add_argument(--pr…

2401d,讨论d串滑动参数

原文 因为对编译时执行的i串的兴趣,我一直在考虑搞个通用用例,而不是相关i串的用例. 滑动模板参数 请考虑以下模板: void pluto(string s)() {pragma(msg, s); } void test() {pluto!"hello"(); }因为s是编译时参数,这编译,而pragma(msg,s) 期望s为编译时值. voi…

Linux第28步_编译“正点原子的TF-A源码”

编译“正点原子的TF-A源码”,目的是想得到TF-A文件,即“tf-a-stm32mp157d-atk-trusted.stm32”。 在前27步的基础上,才可以学习本节内容,学习步骤如下: 1、创建“alientek_tf-a”目录; 2、复制正点原子的…

.【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)

概率图模型是一种用图形表示概率分布和条件依赖关系的数学模型。概率图模型可以分为两大类:有向图模型和无向图模型。有向图模型也叫贝叶斯网络,它用有向无环图表示变量之间的因果关系。无向图模型也叫马尔可夫网络,它用无向图表示变量之间的…

02.部署LVS-DR群集

技能展示: 了解LVS-DR群集的工作原理 会构建LVS-DR负载均衡群集 2.1 LVS-DR 集群 LVS-DR( Linux Virtual Server Director Server )工作模式,是生产环境中最常用的一种工作模式。 2.1.1.LVS-DR 工作原理 LVS-DR 模式&…

在root账号下启动 elasticsearch

最新版本的 elasticsearch 不能用root账号运行,但是每次启动都要切换到其他账号下面,也是一件很麻烦的事情。下面写个脚本,以指定用户运行elasticsearch 假设服务器已经装好了elasticsearch,并且在 /usr/local/elasticsearch-8.1…

Spark---RDD持久化

文章目录 1.RDD持久化1.1 RDD Cache 缓存1.2 RDD CheckPoint 检查点1.3 缓存和检查点区别 1.RDD持久化 在Spark中,持久化是将RDD存储在内存中,以便在多次计算之间重复使用。这可以显著减少不必要的计算,提高Spark应用程序的性能。 val line…

蓝桥杯练习题(七)

📑前言 本文主要是【算法】——蓝桥杯练习题(七)的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 …

kotlin运行

1.使用android studio 由于我本身是做android的,android studio本身有内置kotlin的插件。但若只是想跑kotlin的程序,并不像和android程序绑在一起,可以创建一个kt文件,在里面写一个main函数,就可以直接运行kotlin程序…

Qt中的多线程

Qt中的多线程 目录 1 为什么需要多线程 2 Qt中使用多线程的一些注意事项 3 QThread类 3.1 QThread类的主要接口 3.2 线程的优先级 4 通过继承QThread类实现多线程 5 从QObject类进行派生实现多线程 5 小结 1 为什么需要多线程 在现代化的程序设计开发中,多进程…

【机器学习 西瓜书】期末复习笔记整理

一些杂点: 测试集如何归一化? —— 不是用测试集的均值和标准差,而是用训练集的! 机器学习: 对计算机一部分数据进行学习,然后对另外一些数据进行预测与判断。 参考计算例题: 机器学习【期末复习…

多汗症是否与情绪有关?

多汗症与情绪之间确实存在密切的关系。情绪波动、紧张、焦虑等心理因素是多汗症的常见诱因之一。多汗症患者在情绪激动或紧张时,常常会出现出汗量明显增加的情况。 首先,我们需要了解多汗症的基本病理生理机制。多汗症是由于交感神经过度兴奋引起汗腺过…

Spark-RDD的依赖

RDD的依赖 rdd之间是有依赖关系 窄依赖 每个父RDD的一个Partition最多被子RDD的一个Partition所使用父rdd和子rdd的分区是一对一 mapflatMapfliter 宽依赖 父RDD的Partition会被多个子RDD的Partition所使用父rdd和子rdd的分区是一对多 grouBy()grouByKey()sortBy()sortByKey()…