读高性能MySQL(第4版)笔记10_查询性能优化(上)

news2024/11/25 6:55:00

1. 三管齐下

1.1. 不做、少做、快速地做

1.2. 如果查询太大,服务端会拒绝接收更多的数据并抛出相应错误

1.3. 如果查询写得很糟糕,即使库表结构再合理、索引再合适,也无法实现高性能

1.4. 查询优化、索引优化、库表结构优化需要齐头并进,一个不落

1.5. Percona Toolkit中的pt-archiver工具

2. 响应时间

2.1. 如果把查询看作一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间

2.2. 如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行得更快

2.3. 优化查询的目的就是减少和消除这些操作所花费的时间

2.4. 查询需要在不同的地方花费时间

2.4.1. 网络、CPU计算、生成统计信息和执行计划、锁等待(互斥等待)等操作

2.4.2. 尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作、CPU操作和内存不足时导致的I/O操作上消耗时间

2.5. 两部分之和:服务时间和排队时间

2.5.1. 服务时间是指数据库处理这个查询真正花了多长时间

2.5.2. 排队时间是指服务器因为等待某些资源而没有真正执行查询的时间——可能是等I/O操作完成,也可能是等待行锁

2.6. 响应时间既可能是一个问题的结果也可能是一个问题的原因,不同案例情况不同

2.7. 实际上可以使用“快速上限估计”法来估算查询的响应时间

2.7.1. 了解这个查询需要哪些索引以及它的执行计划是什么

2.7.2. 计算大概需要多少个顺序和随机I/O

2.7.3. 用其乘以在具体硬件条件下一次I/O的消耗时间

2.7.4. 把这些消耗都加起来

2.7.5. 获得一个大概参考值来判断当前响应时间是不是一个合理的值

3. 查询的生命周期

3.1. 从客户端到服务器,然后在服务器上进行语法解析,生成执行计划,执行,并给客户端返回结果

3.2. “执行”可以被认为是整个生命周期中最重要的阶段

4. 优化数据访问

4.1. 如果性能很差,最常见的原因是访问的数据太多

4.2. 是否在检索大量且不必要的数据

4.2.1. 访问了太多的行

4.2.2. 访问了太多的列

4.3. 确认MySQL服务器层是否在分析大量不需要的数据行

4.3.1. 会请求超过实际需要的数据,然后这些多余的数据会被应用程序丢弃

4.3.2. 消耗应用服务器的CPU和内存资源

4.4. 一个常见的错误是,常常会误以为MySQL只会返回需要的数据,实际上MySQL却是先返回全部结果集再进行计算

4.4.1. 最简单有效的解决方法就是在这样的查询后面加上LIMIT子句

4.5. 每次看到SELECT*的时候都需要用怀疑的眼光审视,是不是真的需要返回全部的列,很可能不是必需的

4.5.1. 取出全部列,会让优化器无法完成索引覆盖扫描这类优化

4.5.2. 严格禁止SELECT*的写法,这样做有时候还能避免某些列被修改而带来的问题

4.6. 查询返回超过需要的数据也不总是坏事

4.7. 重复查询相同的数据

4.7.1. 当初次查询的时候将这个数据缓存起来,需要的时候从缓存中取出,这样性能显然会更好

4.8. 检查慢日志记录是找出扫描行数过多的查询的好办法

4.9. 扫描的行数和返回的行数

4.9.1. 查看该查询扫描的行数能够说明该查询找到需要的数据的效率高不高

4.9.2. 理想情况下扫描的行数和返回的行数应该是相同的,但实际中这种“美事”并不多

4.9.3. 扫描的行数与返回的行数的比率通常很低,一般在1:1到10:1之间,不过有时候这个值也可能非常非常大

4.10. 访问类型有很多种,从全表扫描到索引扫描、范围扫描、唯一索引查询、常数引用等

4.10.1. 访问方式可能无须扫描就能返回结果

4.10.2. 访问方式可能需要扫描很多行才能返回一行结果

4.10.3. 没办法找到合适的访问类型,那么最好的解决办法通常就是增加一个合适的索引

4.11. 应用WHERE条件

4.11.1. 在索引中使用WHERE条件来过滤不匹配的记录

4.11.1.1. 在存储引擎层完成的

4.11.2. 使用索引覆盖扫描(在Extra列中出现了Using index)来返回记录

4.11.2.1. 直接从索引中过滤不需要的记录并返回命中的结

4.11.2.2. 在MySQL服务器层完成的,但无须再回表查询记录

4.11.3. 从数据表中返回数据,然后过滤不满足条件的记录(在Extra列中出现Using where)

4.11.3.1. 在MySQL服务器层完成

4.11.3.2. 需要先从数据表中读出记录然后过滤

4.12. 不是说增加索引就能让扫描的行数等于返回的行数

4.13. 优化

4.13.1. 使用索引覆盖扫描,把所有需要用的列都放到索引中,这样存储引擎无须回表获取对应行就可以返回结果了

4.13.2. 改变库表结构

4.13.2.1. 使用单独的汇总表

4.13.3. 重写这个复杂的查询,让MySQL优化器能够以更优化的方式执行

5. 重构查询的方式

5.1. 在优化有问题的查询时,目标应该是找到获得实际需要的结果的替代方法

5.1.1. 但这并不一定意味着从MySQL返回完全相同的结果集

5.1.2. 可以将查询转换为返回相同结果的等价形式,以获得更好的性能

5.2. 以前人们总是认为网络通信、查询解析和优化是一件代价很高的事情

5.2.1. 对于MySQL并不适用

5.2.2. MySQL从设计上让连接和断开连接都很轻量,在返回一个小的查询结果方面很高效

5.2.3. 现代的网络速度比以前要快很多,能在很大程度上降低延迟

5.3. 在MySQL内部,每秒能够扫描内存中上百万行的数据

5.3.1. MySQL响应数据给客户端就慢得多了

5.4. 在其他条件都相同的时候,使用尽可能少的查询当然是更好的

5.4.1. 将一个大查询分解为多个小查询是很有必要的

5.4.2. 如果在一个查询能够胜任时还将其写成多个独立的查询是不明智的

5.5. 切分查询

5.5.1. 删除旧的数据就是一个很好的例子

5.5.1.1. 定期清除大量数据时,如果用一个大的语句一次性完成的话,则可能需要一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询

5.5.1.2. 将一个大的DELETE语句切分成多个较小的查询可以尽可能小地影响MySQL的性能,同时还可以降低MySQL复制的延迟

5.5.2. 一次删除一万行数据一般来说是一个比较高效而且对服务器影响最小的做法(如果是事务型引擎,很多时候小事务能够更高效)

5.5.3. 如果每次删除数据后,都暂停一会儿再做下一次删除,也可以将服务器上原本一次性的压力分散到一个很长的时间段中,可以大大降低对服务器的影响,还可以大大减少删除时锁的持有时间

5.6. 分解联接查询

5.6.1. 很多高性能的应用都会对联接查询进行分解

5.6.2. 可以对每一个表进行一次单表查询,然后将结果在应用程序中进行联接

5.6.3. 让缓存的效率更高

5.6.4. 将查询分解后,执行单个查询可以减少锁的竞争

5.6.5. 在应用层做联接,可以更容易对数据库进行拆分,更容易做到高性能和可扩展

5.6.6. 查询本身的效率也可能会有所提升

5.6.6.1. 使用IN()代替联接查询,可以让MySQL按照ID顺序进行查询,这可能比随机的联接要更高效

5.6.7. 可以减少对冗余记录的访问

5.6.7.1. 在应用层做联接查询,意味着对于某条记录应用只需要查询一次,而在数据库中做联接查询,则可能需要重复地访问一部分数据

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

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

相关文章

JS的WebAPI

WebAPI背景知识 什么是 WebAPI 前面学习的 JS 分成三个大的部分 ECMAScript: 基础语法部分 DOM API: 操作页面结构 BOM API: 操作浏览器 WebAPI 就包含了 DOM BOM. 什么是 API API 是一个更广义的概念. 而 WebAPI 是一个更具体的概念, 特指 DOMBOM,所谓的 API …

使用 Elasticsearch、OpenAI 和 LangChain 进行语义搜索

在本教程中,我将引导您使用 Elasticsearch、OpenAI、LangChain 和 FastAPI 构建语义搜索服务。 LangChain 是这个领域的新酷孩子。 它是一个旨在帮助你与大型语言模型 (LLM) 交互的库。 LangChain 简化了与 LLMs 相关的许多日常任务,例如从文档中提取文本…

服务网格和CI/CD集成:讨论服务网格在持续集成和持续交付中的应用。

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

混淆矩阵细致理解

1、什么是混淆矩阵 混淆矩阵(Confusion Matrix)是深度学习和机器学习领域中的一个重要工具,用于评估分类模型的性能。它提供了一个清晰的视觉方式来展示模型的预测结果与真实标签之间的关系,尤其在分类任务中,帮助我们…

浅谈应急照明系统在民用建筑的设计应用与产品选型

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 【摘要】应急照明分为备用照明、安全照明及疏散照明。文章介绍了应急照明系统的设计、灯具选择、灯具布置、配电等要求。并结合实例进行疏散照明的计算,以指导应急照明系统的设计与应用。 【关键词】照度&#xf…

大数据学习1.4-xShell配置Hadoop

1.创建hadoop目录 mkdir /usr/local/hadoop 2.切换到hadoop中 cd /usr/local/hadoop/ 3.将hadoop直接拖到xShell中 4.解压hadoop tar -zxvf hadoop-2.7.1.tar.gz 5.配置环境变量 vi /etc/profile export PATH$PATH:/usr/local/hadoop/hadoop-2.7.1/bin 6.加载配置文件(不能…

【刷题】蓝桥杯

蓝桥杯2023年第十四届省赛真题-平方差 - C语言网 (dotcpp.com) 初步想法,x y2 − z2(yz)(y-z) 即xa*b,ayz,by-z 2yab 即ab是2的倍数就好了。 即x存在两个因数之和为偶数就能满足条件。 但时间是(r-l)*x&am…

Mybatis学习笔记8 查询返回专题

1.返回实体类 2.返回List<实体类> 3.返回Map 4.返回List<Map> 5.返回Map<String,Map> 6.resultMap结果集映射 7.返回总记录条数 新建模块 依赖 目录结构 1.返回实体类 如果返回多条,用单个实体接收会出异常 2.返回List<实体类> 即使返回一条记…

【软考】系统集成项目管理工程师(四)项目管理一般知识

一、 项目 1、 项目的定义 为大到特定的目的、使用一定的资源、在确定的期间内、为特定发起人而提供独特的产品、服务或成果而进行的一次性努力。 2、项目目标 分类描述成果性目标项目目标&#xff1a;满足客观要求的产品、系统、服务或者成果&#xff1b;例&#xff1a;①…

删除链表中所有含有val的节点

给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 思路1&#xff1a;遍历查找&#xf…

大数据学习1.1-Centos8网络配置

1.查看虚拟网卡 2.配置网络信息 打勾处取消 记住箭头的数字 3.修改 网络连接 4.进入虚拟网络 5.进入属性 6.修改IPv4 5.将iIP和DNS进行修改 6.配置网络信息-进入修改网络配置文件 # 进入root用户 su root # 进入网络配置文件 cd /etc/sysconfig/network-scripts/ # 修改网络配…

C. Beautiful Sets of Points(找规律杂题)

解析&#xff1b; 由于坐标必须为整数&#xff0c;并且距离不能为整数&#xff0c;则同行同列不能存在多个“好点”。 则每行每列只能放一个点&#xff0c;所以最多的点数量即为 min&#xff08;n&#xff0c;m&#xff09;1 #include<bits/stdc.h> using namespace std…

以数据为中心的安全市场快速增长

根据Adroit Market Research的数据&#xff0c;2021年全球以数据为中心的安全市场规模估计为27.6亿美元&#xff0c;预计到2030年将增长至393.48亿美元&#xff0c;2021年至2030年的复合年增长率为30.9%。 研究人员表示&#xff0c;以数据为中心的安全强调保护数据本身&#x…

arcgis栅格按某列属性导出

栅格属性如下 可以看出栅格对应很多属性值&#xff0c;我们要按其中一个属性值作为栅格值 操作如下 只需将栅格值赋值为所需属性数据

后端配置(宝塔):SSH终端设置

一、打开SSH开关 在“安全”中找到SSH管理&#xff0c;按图打开对应按钮 二、复制秘钥 点击“查看密钥”&#xff0c;对密钥进行复制 三、添加服务器 在终端页面添加新的服务器 四、进行密钥连接 输入IP地址&#xff0c;进行root登录&#xff0c;私钥即在“安全”界面复制的…

微服务保护-隔离和降级

隔离和降级 限流是一种预防措施&#xff0c;虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围&#xff0c;避免雪崩&#xff0c;就要靠线程隔离&#xff08;舱壁模式&#xff09;和熔断降级手段了。 线…

MFC串口通信控件MSCOMM32.OCX的安装注册

MSCOMM32.OCX是一个与Microsoft Corporation开发的MSComm控件相关联的文件。MSComm控件是软件应用程序用来与调制解调器、条形码读取器和其他串行设备等设备建立串行通信的通信控件。 下载地址1 https://download.csdn.net/download/m0_60352504/88345092 下载地址2 https://ww…

【无标题】mysql 普通用户连接报错: MySql server has gone away

1、mysql 普通用户连接报错&#xff1a; MySql server has gone away 2、进入mysql错误日志位置查看输出日志显示错误为&#xff1a; [Warning] [MY-013130] [Server] Aborted connection 47 to db: unconnected user: tjcx host: 10.195.11.4 (init_connect command failed; …

437. 路径总和 III

给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到子节点&am…

vue柱状图+折线图组合

<template><div id"main" style"width: 100%;height: 500px; padding-top: .6rem"></div> </template>data() {return {weekData: ["1周","2周","3周","4周","5周","6周&…