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.hqwc.cn/news/511176.html

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

相关文章

C++:String的模拟实现

模拟实现的节奏比较快,大家可以先去看看博主的关于string的使用,然后再来看这里的模拟实现过程 C:String类的使用-CSDN博客 String模拟实现大致框架迭代器以及迭代器的获取(public定义,要有可读可写的也要有可读不可写…

Day16:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

目录 前置知识 指纹识别-本地工具-GotoScan(CMSEEK) Python-开发框架-Django&Flask PHP-开发框架-ThinkPHP&Laravel&Yii Java-框架组件-Fastjson&Shiro&Solr&Spring 思维导图 章节知识点 Web:语言/CMS/中间件/…

基于springboot+vue的医疗挂号管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

002-CSS-三角形

三角形 普通三角形带阴影的三角形:box-shadow带阴影的三角形:filter 普通三角形 💡 Tips:设置 div 盒子宽高为零,使用单边框实现 .triangle {width: 0;height: 0;border: 20px solid transparent;border-top-color: …

GitLab EE 企业版破解

在当今数字化时代,软件开发与团队协作已经成为现代企业不可或缺的一部分。而在这个过程中,版本控制、协作和持续集成等工具的运用变得至关重要。GitLab作为一个领先的、完整的DevOps平台,为团队提供了一个集成的解决方案,使得软件…

Thingsboard本地源码部署教程

本章将介绍ThingsBoard的本地环境搭建,以及源码的编译安装。本机环境:jdk11、maven 3.6.2、node v12.18.2、idea 2023.1、redis 6.2 环境安装 开发环境要求: Jdk 11 版本 ;Postgresql 9 以上;Maven 3.6 以上&#xf…

前端+php:实现提示框(自动消失)

效果 php部分&#xff1a;只展示插入过程 <?php//插入注册表中$sql_insert "INSERT INTO regist_user(userid,password,phone,email)VALUES (" . $_POST[UserID] . "," . CryptPass($_POST[Password]) . "," . $_POST[Phone] . ",&qu…

论文阅读:2022Decoupled Knowledge Distillation解耦知识蒸馏

SOTA的蒸馏方法往往是基于feature蒸馏的&#xff0c;而基于logit蒸馏的研究被忽视了。为了找到一个新的切入点去分析并提高logit蒸馏&#xff0c;我们将传统的KD分成了两个部分&#xff1a;TCKD和NCKD。实验表明&#xff1a;TCKD在传递和样本难度有关的知识&#xff0c;同时NCK…

javascript作用域编译浅析

作用域思维导图 1&#xff1a;编译原理 分词/词法分析 如果词法单元生成器在判断a是一个独立的词法单元还是其他词法单元的一部分时&#xff0c;调用的是有状态的解析规则&#xff0c;那么这个过程就被称为词法分析。 解析/语法分析 由词法单元流转换成一个由元素逐级嵌套所组…

CVE-2024-23334 AIOHTTP 目录遍历漏洞复现

aiohttp简介 aiohttp 是一个基于 asyncio 实现的 Python HTTP 客户端和服务器框架。它提供了异步的 HTTP 客户端和服务器功能&#xff0c;能够处理高并发的网络请求。以下是关于 aiohttp 的一些重要特点和用途&#xff1a; 基于 asyncio&#xff1a;aiohttp 是基于 Python 的 a…

no declaration can be found for element ‘rabbit:connection-factory‘

spring-mvc 配置 rabbitmq 出现问题。 我的解决方案如下&#xff1a; 1 找到配置文件 spring-rabbitmq.xml 我的配置文件叫&#xff1a;spring-rabbitmq.xml&#xff0c;你们按照自己的查找。 2 定位如下URI 接着 Ctrl鼠标左键 3 确定spring-rabbit-x.x.xsd 按照步骤2 &…

Leetcode刷题笔记题解(C++):232. 用栈实现队列

思路&#xff1a;双栈实现入队列和出队列的操作 //AB栈来实现队列 //A栈用来push 可以利用A栈获取到队列的back即A.top //B栈用来pop 如果要获取队列的top&#xff0c;可以先把A栈元素依次弹出依次压入B栈中&#xff0c;然后B.top就是队列的top&#xff0c;pop也类似 cla…