返回顶部
首页 > 资讯 > 数据库 >MySQL 5.7分区表性能下降的原因是什么
  • 767
分享到

MySQL 5.7分区表性能下降的原因是什么

2024-04-02 19:04:59 767人浏览 安东尼
摘要

这篇文章主要讲解了“Mysql 5.7分区表性能下降的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql 5.7分区表性能下降的原因是什么”

这篇文章主要讲解了“Mysql 5.7分区表性能下降的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql 5.7分区表性能下降的原因是什么”吧!

问题描述

Mysql  5.7版本中,性能相关的改进非常多。包括临时表相关的性能改进,连接建立速度的优化和复制分发相关的性能改进等等。基本上不需要做配置修改,只需要升级到5.7版本,就能带来不少性能的提升。

我们在测试环境,把数据库升级到5.7.18版本,验证MySQL  5.7.18版本是否符合我们的预期。观察运行了一段时间,有开发反馈,数据库的性能比之前的5.6.21版本有下降。主要的表现特征是遇到比较多的超时情况。开发另外反馈,性能下降相关的表都是分区表。更新走的都是主键。这个反馈引起了我们重视。我们做了如下尝试:

  1. 数据库的版本为5.7.18, 保留分区表,性能会下降。

  2. 数据库版本为5.7.18,把表调整为非分区表,性能正常。

  3. 把数据库的版本回退到5.6.21版本,保留分区表,性能也是正常

通过上述测试,我们大致判定,这个性能下降和MySQL5.7版本升级有关。

问题重现

测试环境的数据库表结构比较多,并且调用关系也比较复杂。为了进一步分析并定位问题,我们抽丝剥茧,构建了如下一个简单的重现过程

// 创建一个测试分区表t2:  CREATE TABLE `t2`(    `id` INT(11) NOT NULL,    `dt` DATETIME NOT NULL,    `data` VARCHAR(10) DEFAULT NULL,    PRIMARYKEY (`id`,`dt`),    KEY`idx_dt`(`dt`)  ) ENGINE=INNODB DEFAULTCHARSET=latin1       // 插入测试数据  INSERT INTO t2 VALUES (1, NOW(), '1');  INSERT INTO t2 VALUES (2, NOW(), '2');  INSERT INTO t2 VALUES (3, NOW(), '3');     // SESSioN 1 对id = 1的 记录 做一个更新操作,事务先不提交。  BEGIN;UPDATE t2 SET DATA = '12' WHERE id = 1;     // SESSION 2 对id = 2 的记录做一个更新。   BEGIN;UPDATE t2 SET DATA = '21' WHERE id = 2;

在SESSION 2,我们发现,这个更新操作一直在等待。ID是主键,按道理,主键id = 1 的记录更新,不至于影响到主键id = 2的记录更新。

查询infORMation_schema下的innodb_locks这张表。这张表是用于记录InnoDB事务尝试申请但还未获取的锁,以及阻塞其他事务的事务所拥有的锁。有两条记录:

MySQL 5.7分区表性能下降的原因是什么

观察此时的innodb_locks表,事务id=40021锁住第3页的第2行记录,导致事务id=40022无法进行下去。

我们把数据库回退到5.6.21版本,则不能重现上述场景。

进一步分析

根据innodb_locks表提供的信息,我们知道问题在于InnoDB锁定了不恰当的行。该表是memory存储引擎。我们在memory  存储引擎的插入接口设置断点,得到如下堆栈信息。确定是红框部分,将锁信息写入到innodb_locks表中。

MySQL 5.7分区表性能下降的原因是什么

并在函数fill_innodb_locks_from_cache中得以确认,每次写入行的数据,都是从如下代码中Cache对象中获取的。

MySQL 5.7分区表性能下降的原因是什么

我们知道Cache中保存了事务锁的信息,因此需要进一步查找Cache中的数据,是如何添加进去的。通过搜索cache对象在innodb代码中出现的位置,找到函数add_lock_to_cache。在此函数设置断点进行调试后,发现其内容与填写innodb_locks表的数据一致。确定该函数使用的lock对象,就是我们要找的锁对象。

MySQL 5.7分区表性能下降的原因是什么

针对lock_t 类型的使用位置进行排查。经过筛选和调试,发现函数RecLock::lock_add中,生成的行锁被加入到该锁所在的事务链表中。

MySQL 5.7分区表性能下降的原因是什么

RecLock::lock_add函数可以推出行锁的生成原因。因此,通过对该函数进行断点设置,查看函数堆栈,在如下堆栈内,定位到红框位置的函数:

MySQL 5.7分区表性能下降的原因是什么

针对Partition_helper::handle_ordered_index_scan的如下代码进行跟踪,根据该段代码的分析,m_part_spec.end_part  决定了进行上锁的***行数,此处即为非正常行锁生成的原因。

MySQL 5.7分区表性能下降的原因是什么

最终问题归结到m_part_spec.end_part 的生成原因。通过对end_part  使用地方进行排查,最终在get_partition_set函数中定位到该变量在使用前的初始设置值。从代码中可以看出,每次单条记录的update操作,在进行index  scan上锁时,对分区表数目相同的行数进行上锁。这个是根本原因。

 MySQL 5.7分区表性能下降的原因是什么

验证结论

根据之前的分析,每次单条记录的update操作,会对分区表数目相同的行数进行上锁。我们尝试验证我们的发现。

新增如下两条记录:

INSERT INTO t2 VALUES (4, NOW(), '4');  INSERT INTO t2 VALUES (5, NOW(), '5');   // SESSION 1 对id = 1的 记录 做一个更新操作,事务先不提交。  BEGIN;UPDATE t2 SET DATA = '12' WHERE id = 1;  // SESSION 2 现在对id = 4 的记录做一个更新。   BEGIN;UPDATE t2 SET DATA = '44' WHERE id = 4;

我们发现,对id = 4的更新可以正常进行。不会受到id = 1  的更新影响。这是因为id=4的记录,超过了测试案例的分区个数,不会被锁住。在实际应用中,分区表所定义分区数不会如测试用例中的只有3个,而是数十个乃至数百个。这样进行上锁的结果,将加剧更新情况下的锁冲突,导致事务处于锁等待状态。如下图所示,每个事务都上N个行锁,那么这些上锁记录互相覆盖的可能性就极大的提高,也就导致并发下降,效率降低。

MySQL 5.7分区表性能下降的原因是什么

感谢各位的阅读,以上就是“MySQL 5.7分区表性能下降的原因是什么”的内容了,经过本文的学习后,相信大家对MySQL 5.7分区表性能下降的原因是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 5.7分区表性能下降的原因是什么

本文链接: https://lsjlt.com/news/67569.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL 5.7分区表性能下降的原因是什么
    这篇文章主要讲解了“MySQL 5.7分区表性能下降的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL 5.7分区表性能下降的原因是什么”...
    99+
    2024-04-02
  • MySQL性能突然下降的原因
    有时会碰到这样的情况,一条 SQL 在平时执行没问题,很快。但是突然某个时间执行的就会很慢,而且这种场景并不能复现,只能随机发送的。 SQL 执行突然变慢的原因 在之前讲解 MySQL Redo log 时,说到了...
    99+
    2022-05-28
    MySQL 性能 MySQL 性能下降 MySQL 性能下降原因
  • MySQL分区表中分区键必须是主键一部分的原因是什么
    这篇文章主要介绍了MySQL分区表中分区键必须是主键一部分的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL分区表中分区键必须是主键一部分的原因是什么文章都会有所收获,下面我们一起来看看吧。前...
    99+
    2023-06-29
  • redis整数集不能降级的原因是什么
    这篇文章主要为大家展示了“redis整数集不能降级的原因是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“redis整数集不能降级的原因是什么”这篇文章吧。基...
    99+
    2024-04-02
  • MySQL 5.7 vs 8.0版本的性能有什么区别
    这篇文章主要介绍MySQL 5.7 vs 8.0版本的性能有什么区别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!背景测试mysql5.7和mysql8.0 分别在读写、只读、只写模...
    99+
    2024-04-02
  • 网站降权的九种原因及主要表现分别是什么
    这期内容当中小编将会给大家带来有关网站降权的九种原因及主要表现分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。随着SEO行业的发展,在这个行业中越来越多的人参与进...
    99+
    2024-04-02
  • 需要分库分表的原因是什么
    这篇文章主要讲解了“需要分库分表的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“需要分库分表的原因是什么”吧!为什么要分库分表首先回答一下为什么要...
    99+
    2024-04-02
  • mysql中分表与分区的区别是什么
    这篇文章将为大家详细讲解有关mysql中分表与分区的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一,什么是mysql分表,分区什么是分表,从表面...
    99+
    2024-04-02
  • 数据库事务日志自动增长会降低性能的原因是什么
    今天小编给大家分享一下数据库事务日志自动增长会降低性能的原因是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先我为这个...
    99+
    2023-06-17
  • MySQL分库分表后总存储变大了的原因是什么
    本篇内容介绍了“MySQL分库分表后总存储变大了的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • mysql查询时offset过大影响性能的原因是什么
    这篇文章主要介绍了mysql查询时offset过大影响性能的原因是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。准备测试数据表及数据1....
    99+
    2024-04-02
  • css3中动画性能高的原因是什么
    小编给大家分享一下css3中动画性能高的原因是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 性...
    99+
    2024-04-02
  • 索引能提高查询性能的原因是什么
    这篇文章主要介绍“索引能提高查询性能的原因是什么”,在日常操作中,相信很多人在索引能提高查询性能的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”索引能提高查询性能的...
    99+
    2024-04-02
  • 外链导致网站降权的原因是什么
    本篇文章给大家分享的是有关外链导致网站降权的原因是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、外链建设速度过快外链添加速度过快,会让...
    99+
    2024-04-02
  • MySQL中的分区表和临时表是什么
    这篇文章主要为大家展示了“MySQL中的分区表和临时表是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中的分区表和临时表是什么”这篇文章吧。临时表...
    99+
    2024-04-02
  • MySQL临时表可以重名的原因是什么
    这篇文章主要为大家展示了“MySQL临时表可以重名的原因是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL临时表可以重名的原因是什么”这篇文章吧。今天我们就从这个问题说起:临时表有哪...
    99+
    2023-06-29
  • 关于MySQL分区表的一个性能BUG
    目录二、使用pt-pmap进行栈分析三、关于本列中瓶颈点的分析四、分区表中多次建立template的情况五、关于一个特殊的流程六、问题模拟七、总结一、问题描述 最近遇到一个问题,也...
    99+
    2024-04-02
  • MySQL中分区表是什么意思
    这篇文章主要介绍MySQL中分区表是什么意思 ,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对于用户而言,分区表是一个独立的逻辑表,但是在底层由多个物理子表组成。实现分区的代码实际上...
    99+
    2024-04-02
  • MySQL分区表和HBase的关系是什么
    MySQL分区表和HBase的关系是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  创建 MySQL 分区数据  DROP ...
    99+
    2024-04-02
  • mysql表的四种分区方式是什么
    这篇文章主要介绍“mysql表的四种分区方式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql表的四种分区方式是什么”文章能帮助大家解决问题。1、什么是表分区?mysql数据库中的数据是...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作