当前位置: 首页 > news >正文

技术更新!10个MySQL性能调优技巧

MySQL是世界上使用最广泛的开源数据库,它在业界的受欢迎程度让其他数据库望尘莫及。它是一个关系型数据库管理系统,多年来依然是应用程序的核心。在过去几年里,MySQL有一些重要发展。因此,整理更新10个MySQL性能调优技巧。

  1. 模式设计很重要

  2. 辅助索引(Secondary Key)

  3. 行可以从索引中获得服务

  4. 审查与回顾

  5. 可见性很重要

  6. 谨慎使用调优工具

  7. I/O操作仍然昂贵

  8. 利用通用表的表达式优势

  9. 注意云计算

  10. 保持Replication的最新状态

1、模式设计很重要

模式设计是在数据库中最应该重视的事情之一。自MySQL从5.6版本中转移到InnoDB作为默认存储引擎后,模式设计变得更加重要。

在InnoDB中,所有东西都是主键,这与InnoDB组织数据方式有关。在InnoDB中,主键(Primary Key)是集群的,每一个辅助索引(Secondary Key)都会为主键增加一个入口指针。在设计模式时如没有考虑到这点,性能将受到负面影响。

数据使用B树索引存储,以有序的方式插入数据(即准序列值)防止主键碎片化,从而减少寻找叶节点所需的I/O操作。

2、辅助索引(Secondary Key)

辅助索引(Secondary Key)是由一个后台进程更新,对性能影响并不大。主要影响磁盘空间占用,即增加辅助索引会增加存储需求。

对一个没有索引的字段进行过滤,可能会导致每次查询运行时都要进行全表扫描。因此,过度添加索引不会实现性能改进反而会增加存储成本,而且InnoDB必须执行许多后台操作来保持索引的更新。

3、行可以从索引中获得服务

InnoDB可以直接从索引中找到并服务于行记录,而辅助索引(Secondary Key)指向主键,主键包含行记录本身。如果InnoDB缓冲池足够大,可以在内存中容纳大多数数据。甚至可以使用复合键,这比单独的每列键更有效。 

MySQL可以在每个表的访问中使用一个索引,如果正在运行带有WHERE x=1和y=2这样的子句的查询,那么在x,y上建立联合索引比在每个列上有单独的索引要好。

对x,y的联合索引提高查询性能

 

SELECT y FROM table WHERE x=1

MySQL将使用覆盖索引,并从内存中的索引中提供Y。

在实践中,可以通过使用联合索引来提高性能。无论何时,当你设计联合索引时,可以通过从左到右的方式读取索引。

所以给定一个这样的查询:

SELECT a,b,c FROM table WHERE a=1 and b=2

那么,一个关于a,b的联合索引将有助于查询。

但是如果查询是下面这个格式:

SELECT a,b,c FROM table WHERE b=2

那么,这个a,b的联合索引就是无效的,因为违反最左原则,即从左往右读取索引,导致全表扫描。总是从左边读取索引的想法也适用于其他一些情况。

例如,给定以下查询。

 

SELECT a,b,c FROM table WHERE a=1 and c=2

那么在a,b,c上的联合索引将只读取第一列,因为没有通过列b过滤的WHERE子句。这种情况下,MySQL可以部分读取索引,这比全表扫描要好,但仍不足以获得查询的最佳性能。

另一个与查询设计有关的元素是最左边的索引方法,这是MySQL中常用的优化。例如,一个关于a,b,c的索引将不包括像select a,c where c=x这样的查询,因为该查询不能跳过索引的第一部分,即a,b。然而,如果你有一个类似select c,count(c) where a=x and b=y group by c的查询,它对a,b进行过滤并对c进行分组,那么a,b,c上的一个索引可以帮助进行过滤和分组。

4、审查与回顾

定期审查设计,因为应用程序会随着新功能和错误的修复而改变。应用程序的数据集和使用模式会随着时间的推移而改变,这些都会影响查询的性能。

定期审查执行时间非常重要,使用慢速查询日志或性能模式,或使用监控工具可以快速获取数据。

当然,并不是最慢的查询才是最需要解决的问题。例如,一个耗时30秒但每天运行两次的查询,与一个耗时1秒但每分钟运行100次的查询并存。真正应该优化的是第二个查询,因为优化这个查询可以节省大量的时间和资源。

5、可见性很重要

监测是性能调整的关键因素之一。如果不了解当前的工作负载和模式,就很难给出具体的建议。近年来,MySQL改进了对低级别的MySQL/InnoDB指标的暴露,这有助于了解工作负载。

在早期版本中,性能模式是一个瓶颈,有相当大的影响,特别是如果你有许多表。在最近的MySQL版本中,就有明显变化,如新的数据字典,已经改善了性能,即使有很多表,也不会对性能产生大的影响。

6、谨慎使用调优工具

调优工具给出的建议在大多数情况下是有效的。然而,每个工作负载和每个模式有所不同。在某些情况下,调优工具的建议并不奏效,在相信这些建议时,谨慎行事是明智的选择。对于MySQL而言,可以对配置进行如下更改。

例如,将innodb_buffer_pool_size设置为总内存的75%是好的经验法则。然而,在数百GB的内存服务器的情况下,如果你有512GB的内存,那就会留下128GB的自由空间,而不是专门用于缓冲池,这是一种很大的浪费。

innodb_log_file_size和innodb_log_files_in_group也是根据RAM的数量来定义。在内存超过128GB的服务器上,这个设置没有什么意义,因为它将创建64个重做日志文件(Redo log),每个2GB。这将导致128GB的重做日志(Redo log)存储在磁盘上。在大多数情况下,不需要大的重做日志文件(Redo log),即使在最繁忙的环境中。因此,这并不是一个好的建议。

innodb_flushing_method是启用自动配置时唯一正确配置的值。这个变量将flushing 方法设置为O_DIRECT_NO_FSYNC,这是使用Ext4或XFS文件系统时推荐的方法,因为它避免了数据的双重缓冲。

一个好的建议是,在专用服务器上将innodb_buffer_pool_size设置为75%或80%。在拥有大量内存的服务器上,即超过128GB的服务器,在对内存消耗进行适当的分析后,将其增加到90%甚至更多。同样,对于innodb_log_file_size和innodb_log_files_in_group  来说大多数情况下,从2GB的文件开始,监测写日志操作。通常情况下,在确定重做日志(Redo log)的大小时,建议覆盖大约一个小时的写入量。

关于innodb_flush_method,对于Ext4或XFS等现代Linux文件系统,这个选项应该被设置为O_DIRECT或O_DIRECT_NO_FSYNC。

7、I/O操作仍然昂贵

MySQL和InnoDB试图最小化进行I/O操作数量,因为访问存储层在应用性能方面是昂贵的。有些设置会影响InnoDB执行的I/O操作数量。其中有两个设置经常被误解,改变它们往往会导致性能问题。

innodb_io_capacity和innodb_io_capacity_max是与后台Flushing的I/O操作数量有关的变量。许多客户增加这些设置的值,以利用现代固态硬盘的优势,它可以在相对较低的延迟下提供非常高的I/O容量。虽然看上去很合理,但增加I/O容量设置会导致一些问题。

第一个问题是通过使InnoDB过快地刷新脏页导致性能下降,从而减少了“被刷新前多次修改一个页面的机会”。将脏页保留在内存中可以大大减少将数据写入存储的I/O操作。

其次,固态硬盘在出现性能下降之前有一个预期的写入次数。因此,增加写操作的数量会影响你的固态硬盘的寿命,即使你使用的是高端硬盘。

虽说云主机最近很流行,在云中运行MySQL服务实例也是可行的。然而,云中的服务器往往会有I/O限制,或者会对使用更多的I/O收取更多的费用。通过了解这些限制,你可以仔细配置这些参数,以确保不达到这些限制,并使I/O操作最小化。

提到innodb_lru_scan_depth也很重要,因为这个设置控制了缓冲池LRU页面列表中,页面清洁器线程在多远的位置扫描脏页。如果你有一个大的缓冲池和许多缓冲池实例的重写工作负载,你可以通过减少这个变量来减少I/O的操作。

一个好的建议是保持默认值。

8、利用通用表的表达式优势

MySQL 8.0引入通用表的表达式(CTE),可以避免创建派生表的嵌套查询。这个功能允许创建一个自定义查询并引用结果,就好像是一个临时表或一个视图一样。不同的是,CTEs可以在一个事务中被多次引用,而不需要明确地创建和删除它们。

在运行多个查询的复杂事务中往往更快。支持CTE递归,可以在SQL语言中轻松创建复杂的结构,如分层模型和系列。

9、注意云计算

对于MySQL部署,有许多不同的云选项值得考虑,从在虚拟机中实施MySQL服务器实例,到使用数据库即服务(DBaaS)解决方案,选择的范围很广。即使是在云端,也必须理解数据库的基本原理,否则成本将大大增加。往往通过增加更多硬件来解决问题,并未从设计上找问题。

10、保持Replication的最新状态

近年来,围绕着MySQL Replication进行许多改进,在多数情况下无法及时同步主服务器写入操作。在最新的MySQL主要版本中,Replication默认是并行的,即多个Replication线程正在运行并试图同时应用事务。

执行效率很大程度上取决于应用程序写入的工作量,在大多数情况下,并行复制可以帮助复制体跟上写入操作。可以用replica_parallel_type和replica_parallel_workers这两个变量来控制。使用LOGICAL_CLOCK类型,事务被并行应用,并根据时间戳追踪依赖关系。

总体来说,MySQL是数百万开发者的领先开源数据库,它将继续成为世界范围内创建应用程序的首选平台。通过研究围绕模式设计、索引、调整和I/O的问题,可以极大地提高应用程序的性能。当然转移到云端部署方法不同也会有性能差异

相关文章:

技术更新!10个MySQL性能调优技巧

MySQL是世界上使用最广泛的开源数据库,它在业界的受欢迎程度让其他数据库望尘莫及。它是一个关系型数据库管理系统,多年来依然是应用程序的核心。在过去几年里,MySQL有一些重要发展。因此,整理更新10个MySQL性能调优技巧。 模式设…...

ICLR 2023|VLDet:从图像-文本对中学习区域-词语对齐的开放词汇式目标检测

原文链接:https://www.techbeat.net/article-info?id4614&isPreview1 作者:林闯 目标检测任务在AI工业界具有非常广泛的应用,但由于数据获取和标注的昂贵,检测的目标一直被限制在预先设定好的有限类别上。而在学术界&#xf…...

如何效率搭建企业流程系统?试试低代码平台吧

编者按:本文介绍了一款可私有化部署的低代码平台,可用于搭建团队流程管理体系,并详细介绍了该平台可实现的流程管理功能。关键词:可视化设计,集成能力,流程审批,流程调试天翎是国内最早从事快速开发平台研发…...

嵌入式开发:C++在深度嵌入式系统中的应用

深度嵌入式系统通常在C语言中实现。为什么会这样?这样的系统是否也能从C中获益?嵌入式开发人员在将广泛、高效的深度嵌入式代码库从C转换为C方面的实践经验的贡献。嵌入式和深度嵌入式系统通常用C而不是C实现。软件开发人员必须放弃C作为强类型系统、模板元编程(TMP)和面向对…...

快鲸scrm发布快递行业私域运营解决方案

现如今,快递行业竞争格局日益激烈,前有“四通一达”等传统快递企业,后有自带互联网基因、绑定电商流量新贵快递企业,如菜鸟、京东等。在这一背景下,很多快递企业开启了增长破局之旅,他们纷纷搭建起私域运营…...

【蓝桥杯集训·每日一题】AcWing 1497. 树的遍历

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴递归一、题目 1、原题链接 1497. 树的遍历 2、题目描述 一个二叉树,树中每个节点的权值互不相同。 现在给出它的后序遍历和中序遍历,请你输出它的 …...

详解matplotlib的color配置

详解matplotlib的color配置 Matplotlib可识别的color格式 格式举例RGB或RGBA,由[0, 1]之间的浮点数组成的元组,分别代表红色、绿色、蓝色和透明度(0.1, 0.2, 0.5), (0.1, 0.2, 0.5, 0.3不区分大小写的十六进制RGB或RGBA字符串。‘#0f0f0f’, ‘#0f0f0f…...

Oracle删除表数据的三种方式

简介 oracle数据库mysql数据库都是如此 drop命令>truncate命令>delete命令,它们的执行方式、效率和结果各有不同。还是万年的student 学生表 自己可以建个尝试这玩一下。 drop命令 语句: drop table 表名; 理由:1、用drop删除表数据&…...

第 16 章_多版本并发控制

第 16 章_多版本并发控制 1. 什么是MVCC MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作…...

五种 IO 模型

文章目录操作系统和内存内核空间和用户空间应用程序的内核态和用户态网络 IO 和磁盘 IO简易的网络通信流程阻塞和非阻塞阻塞 IO 模型非阻塞 IO 模型IO 复用模型SelectPollEpoll小结信号驱动 IO 模型异步 IO 模型五种 IO 模型的对比IO 模型里的同步和异步5种 IO 模型分别是&…...

34-Golang中的结构体!!!

Golang中的结构体结构体和结构体变量(实例)的区别和联系结构体变量(实例)在内存中的布局如何声明结构体字段/属性注意事项和细节说明创建结构体实例的四种方式结构体使用细节结构体和结构体变量(实例)的区别和联系 1.结构体是自定义的数据类型,代表一类事物2.结构体…...

这6个视频剪辑素材库,你一定要知道~

推荐5个免费商用视频素材网站,建议收藏哦! 1、菜鸟图库 视频素材下载_mp4视频大全 - 菜鸟图库 网站素材量很大,有设计、图片、音频、视频等超多素材,大部分都能免费下载。视频素材都很高清,有自然、人物、科技、农业…...

RocketMQ WIN11 搭建

去官方下载 https://rocketmq.apache.org/zh/download/ 下载,博主下载的是 4.6.0 的版本,选择Binary版本 拓展 Source 下载:需要编译 Binary 下载:不需要编译 解压缩,运行 先解压缩环境变量中添加rocketMQ文件夹路…...

iPhone更换电池和屏幕后提醒非原厂配件的操作办法

---开局一张图,内容全靠编系列! 【图】 自从在iPhone系统iOS13开始支持原厂配件检测后,可以说苹果也动起了维修站商家利益的这块蛋糕。道理自然简单,卷嘛!全球汽车行业也不是靠卖新车才赚钱的,各种交通事故…...

chatGPT发布记录

发行说明(2 月 13 日)我们对 ChatGPT 进行了多项更新!这是新功能:我们更新了免费计划中 ChatGPT 模型的性能,以便为更多用户提供服务。根据用户反馈,我们现在默认让 Plus 用户使用更快的 ChatGPT 版本&…...

DataX及DataX-Web

大数据Hadoop之——数据同步工具DataX数据采集工具-DataX datax详细介绍及使用 一、概述 DataX 是阿里云DataWorks数据集成的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、…...

数据结构与算法系列之kmp算法

什么是kmp算法 1.kmp算法是一种改进的字符串算法,其核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数已达到快速匹配的目的。 它主要实现作用的是 在 (主串)中找到 (匹配)字符串。 例 BF算法与k…...

算法分析详解

自古老的公元前1世纪开始,《周髀算经》就作为中国最古老的天文学和数学著作。 《周髀算经》采用最简便可行的方法确定天文历法,揭示日月星辰的运行规律,包括四季更替,气候变化,南北有极,昼夜相推的道理。为…...

东南大学自然辩证法概论期末总结

写在前面 作者:夏日 博客地址:https://blog.csdn.net/zss192 本文为2022年东南大学自然辩证法概论期末总结,内容为根据老师所发题纲综合多个资料总结得来 考试形式:从老师所发题纲,10个题目中选出4个,题…...

《爆肝整理》保姆级系列教程python接口自动化(二十)--token登录(详解)

简介 为了验证用户登录情况以及减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。有些登录不是用 cookie 来验证的,是用 token 参数来判断是否登录。token 传参有两种一种是放在请求头里,本质上是跟 cookie 是一样的&…...

Cursor实现用excel数据填充word模版的方法

cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

golang循环变量捕获问题​​

在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下: 问题背景 看这个代码片段: fo…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...