【Mysql】Mysql8存储引擎优化与锁和事务管理优化

前一篇博文介绍了Mysql8优化的总体方向,这一篇我们就其中比较重点的内容存储引擎优化与锁和事务管理优化做重点讲解。

一、存储引擎优化

InnoDB 是 MySQL 默认的存储引擎,广泛用于生产环境中,因其支持事务处理、行级锁定和外键等特性而受到青睐。InnoDB 的优化关键在于提高数据处理效率和事务处理速度,确保数据的完整性和并发控制。我们可以从表空间管理、并发控制和缓冲池三个方面来进行优化,具体内容如下:

1. 表空间管理:使用文件每表模式 (innodb_file_per_table)

在 MySQL 中,InnoDB 存储引擎的表空间可以配置为两种模式之一:共享表空间模式(所有表数据和索引存储在一个或几个大文件中)和文件每表模式(每个表数据和索引存储在独立的文件中)。

优点:

  • 管理和维护更简单:在文件每表模式中,每个表的数据和索引被存储在独立的文件中。这使得对单个表的备份和恢复变得简单,特别是在大型数据库环境中。
  • 提高性能:当表特别大时,使用独立的文件可以减少文件系统的碎片,同时减少数据库在维护(如优化表或重建索引)时的 I/O 冲突。
  • 更好的空间回收:删除表时,相关的文件可以被直接删除,立即回收空间,而共享表空间模式下,删除表只会在内部标记为空间可重用,并不直接回收。

缺点:

  • 可能增加操作系统的文件数量:对于包含大量小表的数据库,每个表一个文件可能导致操作系统打开文件的数量急剧增加,这可能影响性能。

要启用文件每表模式,可以在 MySQL 配置文件(通常是 my.cnf 或 my.ini)中设置:

[mysqld]
innodb_file_per_table=1

确保在数据库的初始化或较早阶段设置此参数,因为它只影响之后创建的表。

2. 并发控制

innodb_thread_concurrency 和 innodb_concurrency_tickets 是两个与 InnoDB 并发性能相关的参数。

  • innodb_thread_concurrency:此参数定义了可以同时运行的线程数。设置为 0(默认值)表示没有限制。在系统线程竞争严重的情况下,限制此值有助于减少线程切换的开销,可能提高性能。
  • innodb_concurrency_tickets:此参数定义了在 InnoDB 内部进行线程切换之前,一个线程可以执行的操作数量。默认值是 5000。增加此值可以减少线程之间的切换,适用于查询需要大量内部操作的情况。

这些参数的调整需要根据具体的服务器配置和负载进行,通常需要通过压力测试来找到最优设置。

3. 缓冲池:调整 InnoDB 缓冲池的大小 (innodb_buffer_pool_size)

InnoDB 缓冲池是存储数据和索引的内存区域,其大小是影响 InnoDB 性能的最关键因素之一。

优点:

  • 提高数据访问速度:较大的缓冲池可以存储更多的数据和索引,减少对磁盘的访问,从而加速数据检索。
  • 减少磁盘 I/O:缓冲池中的数据修改(脏页)可以延迟写回到磁盘,集中处理 I/O 操作,减少磁盘 I/O。

设置建议:

  • 通常建议将 innodb_buffer_pool_size 设置为总物理内存的 50%-80%,具体取决于服务器上运行的其他应用程序的内存需求。
  • 在多核处理器上,还可以将缓冲池分为多个部分(通过 innodb_buffer_pool_instances),这样可以减少线程在访问缓冲池时的争用。

例如,如果服务器有 32GB 的 RAM,可以设置:

[mysqld]
innodb_buffer_pool_size = 16G
innodb_buffer_pool_instances = 8

这个配置分配了 16GB 内存给 InnoDB 缓冲池,并将其分割为 8 个实例。分割缓冲池可以帮助减少多线程环境中的锁争用,提高并发访问的效率。

4. 缓冲池的细节优化

除了调整大小和实例数,对缓冲池的其他优化包括:
缓冲池预热(Buffer Pool Preloading):MySQL 允许在服务器启动时加载热点数据到缓冲池,以避免服务器重启后性能下降。这可以通过设置 `innodb_buffer_pool_dump_at_shutdown` 和 `innodb_buffer_pool_load_at_startup` 参数实现。
脏页处理:调整 `innodb_max_dirty_pages_pct`(脏页占缓冲池的最大百分比)和 `innodb_io_capacity`(每秒可处理的 I/O 数)可以优化脏页的刷新策略,平衡系统的写入性能和数据的一致性。

5. 监控和调整

持续监控缓冲池的性能是确保数据库优化的关键。MySQL 提供了多个性能指标来监控缓冲池的状态,如:
- `Innodb_buffer_pool_read_requests`:缓冲池读取的请求数量。
- `Innodb_buffer_pool_reads`:直接从磁盘读取的请求数,这个值越低越好,因为高值意味着缓冲池命中率低。
- `Innodb_buffer_pool_pages_dirty`:缓冲池中脏页的数量,过多的脏页可能会影响性能。

通过分析这些指标,可以调整缓冲池的大小和策略,以适应数据库的实际工作负载。

6. 适应不同的工作负载

不同的应用和工作负载可能需要不同的缓冲池配置。例如,对于读密集型的应用,增加缓冲池的大小可以增加数据的命中率,从而提高查询性能;而对于写密集型的应用,可能需要更频繁地刷新脏页,以保证数据的及时性和减少恢复时间。

7. 使用工具进行调优

利用 MySQL Workbench 等工具可以帮助更容易地监控和调整 MySQL 的配置。这些工具通常提供图形界面来显示性能指标和简化配置过程。

通过这些策略,我们可以确保 InnoDB 存储引擎的缓冲池配置得当,从而最大化数据库的性能和效率。持续的监控和调整根据实际的应用需求和硬件变化是维持数据库性能的关键部分。

二、锁和事务管理优化

在 MySQL 中优化锁和事务管理是提高数据库性能和并发性的关键组成部分。正确的锁策略和事务控制可以显著减少冲突、防止数据不一致,并提高资源的利用效率。以下是一些针对 MySQL 锁和事务管理的优化策略:

1. 选择合适的事务隔离级别

MySQL 支持四种事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ(默认级别)、和 SERIALIZABLE。选择合适的隔离级别可以平衡性能和数据一致性的需求:

  • READ UNCOMMITTED:最低的隔离级别,允许读取未提交的数据(脏读),适用于对一致性要求不高的场景。
  • READ COMMITTED:允许读取和写入已提交的数据,适合大多数需要避免脏读和不可重复读的应用。
  • REPEATABLE READ:默认级别,确保在同一事务内读取的数据一致性,防止脏读和不可重复读,但可能发生幻读。
  • SERIALIZABLE:最高的隔离级别,通过锁定涉及的数据行来模拟事务串行执行,适用于需要极高数据一致性的场景。

调整隔离级别可以通过以下 SQL 命令实现:

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

2. 理解和优化锁

MySQL 主要使用两种类型的锁:共享锁(读锁)和排他锁(写锁)。优化锁的使用可以减少锁争用和死锁的发生:

  • 避免不必要的锁定:确保事务尽可能短,避免长事务持有锁定时间过长。
  • 使用索引:适当的索引可以减少锁的粒度,从而减少锁冲突。例如,确保 WHERE 子句中的条件列上有索引,可以避免全表扫描引发的锁扩展。
  • 减少锁范围:尽量只锁定需要修改的数据行,而非整个表。

3. 死锁检测与解决

死锁是数据库管理中常见的问题,MySQL 提供了自动死锁检测和解决机制。了解和优化这些特性可以帮助快速解决死锁问题:

  • 死锁日志:通过 SHOW ENGINE INNODB STATUS 命令查看死锁的详细信息,分析和优化导致死锁的查询。
  • 配置死锁超时:通过设置 innodb_lock_wait_timeout 参数来决定事务等待锁的超时时间。

4. 使用乐观锁和悲观锁

根据应用的具体需求,选择乐观锁或悲观锁策略:

  • 乐观锁:适用于冲突较少的环境,通过版本号或时间戳来判断数据在读取和写入期间是否被修改过。
  • 悲观锁:适用于高冲突环境,事务开始时就锁定涉及的数据。

5. 监控和优化事务日志

事务日志是 MySQL 事务处理的重要组成部分,优化日志可以提高事务的处理效率:

6. 优化事务的设计和执行

7. 监控锁与事务性能

8. 应用程序层面的事务管理

最后,事务管理不仅仅是数据库层面的问题。应用程序的设计和逻辑也极大地影响事务的效率和效果:

通过综合考虑数据库配置、查询优化、事务设计和应用程序逻辑,可以有效地提高 MySQL 数据库的事务处理性能和并发处理能力。

  • 适当配置日志文件大小:通过 innodb_log_file_size 设置合理的日志文件大小,以平衡性能和

    恢复时间的需求。如果日志文件过小,可能会频繁地进行日志刷新和日志回滚操作,从而影响性能;而过大的日志文件可能增加系统崩溃后的恢复时间。

  • 调整日志缓冲区大小:通过 innodb_log_buffer_size 设置日志缓冲区的大小,可以控制事务日志写入磁盘前在内存中的缓存量。增加日志缓冲区的大小可以减少对磁盘的写操作次数,从而提高事务处理的性能,特别是在高并发的写操作下。

  • 控制日志写入和刷新频率innodb_flush_log_at_trx_commit 参数控制事务日志的刷新行为。设置为 1 表示每次事务提交都会刷新日志到磁盘,这提供了最高的数据安全性但可能影响性能;设置为 2 表示日志只在每秒刷新到磁盘一次,提高了性能但在系统崩溃时可能丢失最近一秒的数据;设置为 0 表示日志只写入到日志缓冲区,依赖操作系统的缓存机制来刷新数据,这种方式提供最高的性能但数据安全性最低。

  • 最小化事务作用范围:只在必要时开启事务,并尽可能缩短事务的持续时间和作用范围。这可以减少锁定资源的时间,从而减少锁冲突和提高并发性能。

  • 批量操作优化:对于需要修改大量数据的操作,考虑分批次进行,每批次处理一部分数据并提交事务。这样可以避免长时间锁定大量数据,减少对其他事务的影响。

  • 合理使用事务隔离级别:在确保数据一致性的前提下,选择尽可能低的事务隔离级别,以减少锁的使用和提高性能。例如,如果应用可以容忍不可重复读,可以选择 READ COMMITTED 而不是 REPEATABLE READ。

  • 使用性能监控工具:利用 MySQL 的性能监控工具,如 Performance Schema,监控锁的使用情况和事务性能。这可以帮助识别高频发的锁冲突和长事务,以便进行针对性的优化。

  • 分析和优化慢查询:通过慢查询日志分析长时间执行的查询,并优化这些查询或相应的数据库设计,以减少它们对事务性能的影响。

  • 避免应用层的事务误用:例如,不必要的循环事务或错误的事务嵌套可以导致性能问题。确保开发团队了解正确的事务使用方法和最佳实践。

  • 事务的错误处理:合理地处理事务中的错误和异常,确保在遇到错误时能够正确回滚事务,防止数据不一致或资源未正常释放。

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

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

相关文章

基于RT-Thread的智能家居助手

一、项目简介 智能家居助手主要基于RT-Thread开发的,该系统主要分为语音子系统,环境监测子系统,智能控制子系统,智能网关子系统,音乐播放器,云端以及应用软件七大部分。语音子系统可通过语音进行人机交互来…

OpenCV——图像分块局部阈值二值化

目录 一、算法原理1、算法概述2、参考文献 二、代码实现三、结果展示 OpenCV——图像分块局部阈值二值化由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法概述 针对目前局部阈值二值…

from_pretrained明明以及下载好模型,却突然不能加载了报错

本人报错:OSError: Error no file named model_index.json found in directory /home/xxx/我的python学习/textToImage/sdxl-turbo. 原因:路径错误导致无法加载模型的配置文件 pipe AutoPipelineForText2Image.from_pretrained("stabilityai/sdx…

HORROR SYSTEM

HORROR SYSTEM是一个创新的工具包,允许开发者在Unity3D中创建独特的原创恐怖游戏。 HORROR SYSTEM是一款强大而灵活的工具,旨在基于Unity3D引擎创建沉浸式第三人称恐怖游戏。 这项资产易于使用且直观,可以让任何经验水平的开发人员将他们的想法付诸实践,创造出高质量、充满…

文献速递:深度学习胶质瘤诊断---空间细胞结构预测胶质母细胞瘤的预后

Title 题目 Spatial cellular architecture predicts prognosis in glioblastoma 空间细胞结构预测胶质母细胞瘤的预后 01文献速递介绍 胶质母细胞瘤的治疗耐药性的关键驱动因素是肿瘤内的异质性和细胞状态的可塑性。在这里,我们调查了空间细胞组织与胶质母细胞瘤…

python爬虫 - 爬取html中的script数据(zum.com新闻信息 )

文章目录 1. 分析页面内容数据格式2. 使用re.findall方法,编写爬虫代码3. 使用re.search 方法,编写爬虫代码 1. 分析页面内容数据格式 (1)打开 https://zum.com/ (2)按F12(或 在网页上右键 --…

C++中的五种高级初始化技术:从reserve到piecewise_construct等

C高级初始化技术:reserve、emplace_back、constinit、Lambda表达式、piecewise_construct 一、简介二、reserve 结合 emplace_back三、C 20的constinit四、Lambda表达式和初始化五、make_unique_for_overwrite六、piecewise_construct 和 forward_as_tuple七、总结 …

SpringBoot xxl-job 任务调度

首先官网下载xxl-job的源代码,然后切换到jdk8,等Maven下载依赖 执行mysql的脚本,修改连接配置,启动admin站点 默认地址 http://localhost:8080/xxl-job-admin/ 先新增一个任务执行器,指向未来任务代码的站点 然后在…

Vue.js应用中的多元化通信策略:10+种方法深度解析

Vue.js应用中的多元化通信策略:10种方法深度解析 在构建复杂且交互丰富的Vue 2.x应用程序时,有效的组件间通信是确保数据流通、状态同步与逻辑协调的关键。本文将深入探讨超过10种适用于Vue 2.x的应用内通信方法,覆盖父子组件、兄弟组件、跨…

探索亚马逊云科技「生成式 AI 精英速成计划」

目录 前言「生成式 AI 精英速成计划」技术开发课程学习课程学习 总结 前言 亚马逊云科技(Amazon Web Services,简称AWS)作为全球领先的云计算服务提供商,一直以来在推动人工智能(AI)领域的发展中扮演着重要…

04_c/c++开源库 json解析jsoncpp库

1.说明与安装 说明: c json字符解析 安装: sudo apt-get install libjsoncpp-dev 编译依赖 pkg-config --cflags --libs jsoncpp -I/usr/include/jsoncpp -ljsoncpp 编译选项: -I/usr/include/jsoncpp 连接选项: -ljsoncpp 2.实例 1.代码 1_jsonCpp_解析字符串_增.删.改…

IContentService

目录 1、 IContentService 1.1、 // * 保存文章 1.2、 * 发布文章 1.3、 *查询文章返回多条数据 1.4、 * 根据id或slug获取文章 1.5、 * 查询分类/标签下的文章归档 2、 IRelationshipService

Gitea:轻量级、开源的Git仓库管理平台

引言 Gitea是一款开源的、基于Go语言编写的轻量级Git服务器。它提供了类似于GitHub的功能,如代码托管、版本控制、团队协作等,但更加轻便和易于部署。Gitea的设计初衷是为了让团队或个人能够更方便地管理和分享自己的代码,同时不需要花费大量…

MATLAB将多张小图整合到一张大图形成模板图

MATLAB将多张小图整合到一张大图形成模板图 代码如下: clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;foldername字符模板; [datacell,filenamecell,filenameAllcell]readfun_1n(foldername); K2length(filenamecell);% …

常见射频指标的本质和意义(一)

1、Rx Sensitivity(接收灵敏度) 接收灵敏度,这应该是最基本的概念之一,表征的是接收机能够在不超过一定误码率的情况下识别的最低信号强度。这里说误码率,是沿用CS(电路交换)时代的定义作一个通…

【YOLO改进】主干插入SKAttention模块(基于MMYOLO)

SKAttention模块 论文链接:https://arxiv.org/pdf/1903.06586.pdf 将SKAttention模块添加到MMYOLO中 将开源代码SK.py文件复制到mmyolo/models/plugins目录下 导入MMYOLO用于注册模块的包: from mmyolo.registry import MODELS 确保 class SKAttention中的输入维度为in_cha…

读天才与算法:人脑与AI的数学思维笔记08_生物的创造力

1. 生物的创造力 1.1. 在进化树中是否有其他的物种已经具有与我们人类相当的创造力水平 1.2. 20世纪50年代中期,动物学家德斯蒙德莫里斯(Desmond Morris)在伦敦动物园做了这样一个试验 1.2.1. 动物学家给…

Laravel 6 - 第十四章 响应

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

《ESP8266通信指南》4-以Client进行TCP通信(AT指令)

往期 《ESP8266通信指南》3-常用AT指令详解-8266连WIFI-CSDN博客 《ESP8266通信指南》2-ESP8266 AT测试-CSDN博客 《ESP8266通信指南》1-ESP8266 简介-CSDN博客 1. 小节目标 通过 AT 指令使用 8266 进行 TCP 通信 2. 书接上回 复习以下,上一小节我们讲到了 8…

学习java第五十天

Spring框架中的Bean的生命周期是什么? 在Spring中,Bean的生命周期可以被划分为以下阶段: 实例化:在这个阶段中,Spring容器根据Bean的定义,通过反射或其他方法来创建Bean的实例。这个阶段包括调用构造方法和…