MySQL——性能调优

news2024/11/15 17:35:56

性能调优(重要)

SQL 优化的目的

  • 减少磁盘 IO:尽可能避免全表扫描、尽量使用索引、尽量使用覆盖索引减少回表操作
  • 减少 CPU 和内存的消耗,尽可能减少排序、分组、去重之类的操作,尽量减少事务持有锁的时间

优化途径:找到 慢 SQL 语句 -> explain 分析 SQL,针对性优化 SQL

找到慢 SQL

使用慢查询日志,会帮我们记录耗时超过 n 秒的 SQL 语句,可以通过这个慢查询日志,发现慢 SQL

# 怎么发现慢SQL
show variables like '%slow_query_logs';

# 开启慢SQL日志命令
set global show_query_log='ON';

# 设置慢查询门限时间,如2s
set global long_query_time=2;

# 也可以修改my.cnf文件,设置参数,然后重启MySQL

explain 的使用

找到慢 SQL 的语句后,explain 进行分析

explain select * from test

重点关注的列

type

执行效率由低到高

  1. ALL(全表扫描):性能最差,需要避免,上面的例子就用到了全表扫描
  2. index(全索引扫描):对二级索引进行全扫描,性能跟全表扫描差不多
  3. range
  4. ref
  5. eq_ref
  6. const

key:

表示实际用到的索引,如果为 NULL,则表示没用到索引。这种情况需要注意!

extra:记录一些额外的信息

  • Using filesort:表示 SQL 需要进行额外的步骤来对返回的结构进行排序。它会根据连接类型、存储排序键值和匹配条件的全部行记录进行排序
  • Using tempory:表示 MySQL 需要创建一个临时表来存储结构,非常消耗性能

rows

表明 SQL 返回请求数据的行数

如何设计索引

一张表中只有主键的默认添加索引的,还可以针对其他列建立索引来提高查询性能

通常情况下:

  • 频繁出现在 WHERE 中的列
  • 通常出现在 ORDER BY 中的列,这样查询的时候就不需要再进行一次排序了,因为建立在索引之后再 B+树中的记录都是按顺序排好的
  • 区分度很高的列,如我们在联合查询的时候,经常用用户名 + 其他一起查询,那么可以给用户名建立索引,因为用户名唯一,但是不能给性别建立索引,因为区分度不高,建索引没意义

注:建联合索引目的是减少回表

减少锁持有时间

案例 1 改语句顺序

执行 update 语句的时候,会对记录加行级锁,这个锁是在事务提交之后才会释放。

如果 update 和 select 语句之间没有什么依赖关系,那么应该把加锁的语句,放在事务靠后的位置,减少加锁的时间,这样能提高整体的并发性能

案例 2 分批删除

删除大量数据表数据的时候,最好采用分批删除的方式,如果直接执行删除操作 ,那么delete 语句产生的行锁,要在所有数据删除完之后,才会释放锁,锁持有的时间会很长,会影响其他事务的操作。改进方式,采用 limit 的方式来分批删除,比如每次取 1000 条记录进行删除,这也可以减少锁持有的时间。

其他

1、 避免索引失效

索引失效的七个场景:模型数空运最快

模糊查询、数据类型不匹配、函数、空值、运算、最左前缀匹配、全表更快

2、设计表的时候要做一定的反范式设计,建表的时候考虑增加冗余字段,尽可能保持单表查询,而非多表 JOIN

总结

如何优化慢 SQL?

  • 优化数据访问:使用 select + limit 避免使用 select * ,减少非必要的数据返回
  • 切分查询,针对一个大查询拆分成多个小查询,每个小查询只返回一部分数据,比如,批量删除 1000 万条数据,可以改成分批查询,一次删除 1000 条。
  • 覆盖索引:如果没有索引,就考虑建立普通索引或覆盖索引,通过覆盖索引的查询,避免回表
  • 避免索引失效
  • 减少连表查询
  • 优化排序

如果 SQL 和索引都没问题,查询还是很慢怎么办?

分析:往系统架构方向上思考

  • 分批查询:针对一个大查询,拆分成多个小查询,每个查询只返回一部分数据
  • 增加缓存,针对频繁查询的热点数据,我们可以方法 redis 中
  • 分表:如果表中的数据量很大了,比如表达到千万级别了,这时就可以考虑分表了,通过减少每次查询数据总量来解决数据查询缓慢的问题。
  • 主从复制:针对读多写少的情况,我们可以搭建 MySQL 主从模式来分摊请求的数量
  • 分库:针对写多读少的情况,单库的性能无法抗住高并发流量,就要进行分库,把请求分摊到多个实例中去

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

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

相关文章

在三个el-form-item中的el-radio的值中取一个发送给后端怎么获取

问: 请问,这段代码怎么获取:无策略,策略1,策略2的值? 回答: 问: 三个里面只可以选中一个吗? 回答:

SpringCloud-数据认证加密总结

一、数据加密认证介绍 在当今分布式系统的日益复杂和信息传递的广泛网络化环境中,确保通信的安全性至关重要。数据的加密和认证作为保障信息传递安全的关键手段,在分布式系统中扮演着不可或缺的角色。Spring Cloud,作为一套构建微服务架构的…

【LeetCode每日一题】1976. 到达目的地的方案数

文章目录 [1976. 到达目的地的方案数](https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/)思路:代码: 1976. 到达目的地的方案数 思路: 利用 Dijkstra 算法计算最短路径,并同时记录最短路径的数量&#xf…

双指针的一些题目

题目1:统计子矩阵 4405. 统计子矩阵 - AcWing题库 解题 前缀和暴力枚举x1、y1、x2、y2的做法是O()的,考虑用双指针进行优化。 优化的方式是:我们将每一列在[x1,x2]范围内的部分看作一个整体,用指针维护左右边界。 当当前矩阵的…

直播预告|从一张 CD 说起,关于播放器的前世今生

1877 年,天才发明家爱迪生研发出了人类历史上第一台可以录音和放音的装置,被称为“话筒”。 当时,这台机器使用一张薄薄的铁箔盘来录制声音,爱迪生亲手转动铁箔盘,在上面刻下声音的波纹。不过这个设计并不太实用&…

python中的defaultdict

collections.defaultdict 是 collections 模块提供的一个有用的类,它是内置字典类 dict 的一个子类。与普通字典一样,可以进行元素的访问、添加、删除等操作。区别在于当访问一个不存在的键时,defaultdict 会返回默认值,而不会引发…

ArcGIS学习(十二)ModelBuilder参数化建模

ArcGIS学习(十二)ModelBuilder参数化建模 1.ModelBuilder应用基础 本任务给大家带来的是ArcGIS中一个非常有意思也很重要的模块一-ModelBuilder。ModelBuilder有什么用呢? 大家设想一下这些场景: 你在做一项复杂研究,使用到ArcGIS中的多个工具和步骤,包括缓冲区分析、空…

建立网络防御时需要重点考虑的10个因素

互联网安全中心(CIS)建议企业可以从以下10个因素入手:资产管理、数据管理、安全配置、账户和访问控制管理、漏洞管理、日志管理、恶意软件防御、数据恢复、安全培训和事件响应。 1、资产管理 建立网络防御的第一步是制定企业资产和软件资产的…

居间中介CRM系统:提升销售业绩,有效管理企业客户资源

居间中介CRM系统是一种用于提升销售业绩和有效管理企业客户资源的软件系统。它能够帮助居间中介机构跟踪和管理客户关系,提高销售团队的工作效率和组织能力。 鑫鹿居间中介CRM系统具备以下功能: 1. 客户管理 系统可以记录和维护客户的基本信息&#xf…

Nano 33 BLE Sense Rev2学习第一节——环境配置

参考文档见Access Barometric Pressure Sensor Data on Nano 33 BLE Sense | Arduino Documentation 打开Arduino ide安装开发板 选择开发板 连接开发板到电脑,自动识别开发板端口,选择端口

小华最多能得到多少克黄金 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 小华按照地图去寻宝,地图上被划分成 m 行和 n 列的方格横纵坐标范围分别是[ 0 ,n−1]和[ 0 , m−1]。 在横坐标和纵坐标数位之和不大于 k 的方格中存…

了解现货黄金的技术分析技巧

在金融市场,特别是现货黄金交易领域中,投资者和交易者都致力于寻找那些可以带来盈利的秘诀与策略。黄金作为一种避险资产,其价格受到众多因素的影响,包括全球经济状况、货币政策、市场需求等。因此,掌握现货黄金的技术…

如何分辨Mac设备X86或ARM

在终端中输入如下命令可以获取到当前 Mac 设备是 X86 还是 ARM 类型 uname -a 以上便是此次分享的全部内容,希望能对大家有所帮助!

ModuleNotFoundError:如何解决 no module named Python 错误?

1.问题描述 下面的python执行时: import chinese_calendar import datetime def is_holiday(year, month, day):return chinese_calendar.is_holiday(year, month, day) # 判断2023年2月14日是否为节假日 print(is_holiday(2023, 2, 14)) # 输出: False报错如下&a…

AI从截图直接生成代码、前端程序员的福音

简介 项目可以将任何屏幕截图或设计转换为干净的代码(支持大多数框架)。来自领先公司的开发人员和设计师使用的排名第一的工具。完全开源,在 GitHub 上拥有超过 35,000 颗星。非常受欢迎。 各位小伙伴们感觉有帮助的,可以收藏一…

Docker中使用nginx-rtmp推拉网络摄像头视频流

前言: 该部分比较麻烦,闹腾了好久(ffmpeg推拉流没学过,事实证明依葫芦画瓢是不行滴,后面有时间再学吧),后来借助chatGPT勉强解决,但不是很懂。因个人能力有限,只复述操作…

前端部署真的不简单

公众号:程序员白特,欢迎一起交流学习~> 原文:前端部署真的不简单 - 掘金 (juejin.cn) 现在大部分的中小型公司部署前端代码都是比较简单的,主要步骤如下: 首先,通过脚手架提供的命令npm run build打包前端代码&…

外汇天眼:蓝莓市场终止所有MT4/MT5专业公司业务

总部位于澳大利亚的零售外汇和差价合约经纪商蓝莓市场宣布,已终止其数据和平台服务产品,该产品旨在通过利用其基础设施为专业公司行业提供服务。 蓝莓市场表示,已经对其数据和平台服务产品“落下帷幕”,与所有专业交易公司包括MyF…

3分钟开通GPT-4

AI从前年12月份到现在已经伴随我们一年多了,还有很多小伙伴不会开通,其实开通很简单,环境需要自己搞定,升级的话就需要一张visa卡,办理visa卡就可以直接升级chatgptPLSU 一、虚拟卡支付 这种方式的优点是操作简单&…

html邮件基本使用方法?如何发送HTML邮件?

html邮件是什么意思?如何在HTML中创建电子邮件链接? HTML邮件以其丰富的格式和视觉效果,让我们的邮件内容更加生动和吸引人。那么,HTML邮件的基本使用方法是什么呢?我们又该如何发送HTML邮件呢?下面&#…