MySQL——性能调优

性能调优(重要)

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.mfbz.cn/a/431097.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QEMU设备直通pass through的地址映射转换

[内核:HVA]->[QEMU:HVA]的mmap地址映射 $ sudo cat /proc/2047239/maps | grep -i vfio address perms offset dev inode pathname 7f4b5444a000-7f4b5445a000 rw-s 9da50000 00:0e 13037 anon_inode:[vfi…

稀碎从零算法笔记Day7-LeetCode:罗马数字转整数

题型:字符串转化、找规律 链接:13. 罗马数字转整数 - 力扣(LeetCode) 来源:LeetCode 题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 …

【HTML】day01

列表 作用&#xff1a;布局内容排序整齐的区域。 列表分类&#xff1a;无序列表、有序链表、定义列表 无序列表 <ul><li>test</li><li>test</li><li>test</li><li><h1>h1</h1></li></ul><!DOCTYPE…

DolphinScheduler——奇富科技的调度实践

目录 一、技术架构 二、业务挑战 2.1 调度任务量大 2.2 运维复杂 2.3 SLA要求高 三、调度优化实践 3.1 重复调度 3.2 漏调度 3.3 Worker服务卡死 3.4 任务重复运行 四、服务监控 4.1 方法耗时监控 4.2 任务调度链路监控 五、用户收益 原文大佬的这篇调度系统案例…

【Gitee】创建第一个仓库并提交第一次代码

目录 第一步&#xff1a;注册登录 第二步&#xff1a;创建第一个仓库 1、我的工作台 → 创建我的仓库 2、填写内容 3、创建 第三步&#xff1a;第一次提交代码 1、参考资料 2、操作 2.1 idea创建项目 2.2 项目内容推送至远程 最后&#xff1a;平台相关资料库 第一步…

1.Zookeeper理论基础

1.Zookeeper的基本概念 是一个分布式应用协调框架 &#xff0c;java编写的。客户端 /服务端 的架构模式。CP设计(一致性&#xff0c;分区容错) 它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;服务注册服务、状态同步服务、集群管理、分布…

解决物理机装不上VMnet1和VMnet8的虚拟网卡问题

问题描述&#xff1a; 博主在使用虚拟机时&#xff0c;发现物理机的ping命令连接不上虚拟机&#xff0c;导致xshell软件也连接不上&#xff0c;最后发现问题是更改适配器设置中没有虚拟机的网卡&#xff08;VMnet1和VMnet8&#xff09;&#xff1a; 方法一&#xff1a; 博主搜…

虽然写了不少前端代码,但是我真没搞懂什么是 JavaScript

追溯到 1998 年第一次拥有个人电脑开始&#xff0c;JavaScript 可能是我最早接触的编程语言&#xff0c;不过这么多年过去了&#xff0c;我现在又变得迷糊了&#xff0c;我反倒搞不清楚什么是 JavaScript 了。 一、历史 JavaScript最早是由Brendan Eich在1995年发明的。当时&…

SPC 之 I-MR 控制图

概述 1924 年&#xff0c;美国的休哈特博士应用统计数学理论将 3Sigma 原理运用于生产过程中&#xff0c;并发表了 著名的“控制图法”&#xff0c;对产品特性和过程变量进行控制&#xff0c;开启了统计过程控制新时代。 什么是控制图 控制图指示过程何时不受控制&#xff…

【pyinstaller打包记录】程序使用多进程,打包后,程序陷入死循环

简介 PyInstaller 是一个用于将 Python 程序打包成可执行文件&#xff08;可执行程序&#xff09;的工具。它能够将 Python 代码和其相关的依赖项&#xff08;包括 Python 解释器、依赖的模块、库文件等&#xff09;打包成一个独立的可执行文件&#xff0c;方便在不同环境中运行…

YOLOv8从入门到入土使用教程!(二)目标预测

⭐⭐⭐瞧一瞧看一看&#xff0c;新鲜的YOLOv9魔改专栏来啦&#xff01;⭐⭐⭐ YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新 一、本文介绍 本文将演示如何使用YOLOv8进行训练及预测&#xff01;模型训练教程参考下文&#xff1a; YOLOv8从…

python实现常见一元随机变量的概率分布

一. 随机变量 随机变量是一个从样本空间 Ω \Omega Ω到实数空间 R R R的函数&#xff0c;比如随机变量 X X X可以表示投骰子的点数。随机变量一般可以分为两类&#xff1a; 离散型随机变量&#xff1a;随机变量的取值为有限个。连续型随机变量&#xff1a;随机变量的取值是连…

线上问题——学习记录幂等判断失效问题分析

一、业务流程 上图是对save和saveScore两个接口的流程抽象&#xff0c;save是上传答题数据&#xff0c;saveScore则是上传答题分数&#xff0c;为保证幂等和防止并发调用&#xff0c;这两个接口都加了分布式锁&#xff08;还是两层哦&#xff09;。第一层使用的是不同的锁&…

【C++】STL简介 | STL六大组件 | string类 | string类对象操作

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的缺陷 5. 引出string类 6. 标准库中的string类 6.1 string类简介 6.2 string类对象的构造 6.3. string类对象的容量 6.4. string类对象的遍历 6.5. string类对象的修改 6.6. string类非成员函数 6.7. vs…

品优购首页制作

一&#xff0c;常用模块类名命名 二&#xff0c;快捷导航shortcut制作 三&#xff0c;header制作 3.1LOGO SEO优化 3.2 搜索模块定位 四&#xff0c; nav导航制作 五&#xff0c;footer底部制作 六&#xff0c;main主体模块制作 以前书写是模块化中的公共部分 main主体模块是…

GEE入门篇|图像分类(一):监督分类

在遥感中&#xff0c;图像分类是尝试将图像中的所有像素分类为有限数量的标记土地覆盖和/或土地利用类别。 生成的分类图像是从原始图像导出的简化专题图&#xff08;图 1&#xff09;&#xff0c; 土地覆盖和土地利用信息对于许多环境和社会经济应用至关重要&#xff0c;包括自…

鸿蒙开发,对于前端开发来说,究竟是福是祸呢?

提前声明&#xff1a; 先说好哈&#xff0c;不要一上来就开喷&#xff0c;好吧&#xff0c;不感兴趣的话你可以不用看下文直接划走&#xff0c;直接喷俺有点承受不住&#xff0c;心脏不好。如果你感兴趣&#xff0c;你可以先把这篇文章看完&#xff0c;看完后感觉俺讲的还挺有道…

堆和二叉树的动态实现(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

Linux - 基础IO

1、回顾 1.1、来段代码回顾C文件接口 hello.c写文件 #include <stdio.h> #include <string.h> int main() {FILE *fp fopen("myfile", "w");if(!fp){printf("fopen error!\n");}const char *msg "hello bit!\n";int …

xss.haozi.me:0x03及04

这里有一个正则所以&#xff08;&#xff09;要用到实体编码 <a href"javascript:alert1">cc</a> 03 04都一样