• 【Mysql】什么是大事务?以及大事务产生的问题


    一、定义

    运行时间比较长,操作的数据比较多的事务我们称之为大事务。

    例如,执行超过5s,10s,1min…

    二、大事务风险

    • 锁定太多的数据,造成大量的阻塞和锁超时,回滚所需要的时间比较长。
    • 执行时间长,容易造成主从延迟。
    • undo log膨胀

    三、避免大事务

    • 避免一次处理太多大数据。
    • 移出不必要在事务中的select操作

    我这里按公司实际场景,规定了,每次操作/获取数据量应该少于5000条,结果集应该小于2M

    四、案例

    创建表

    建表sql

    CREATE TABLE `apple_test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `a` int(11) NOT NULL DEFAULT '0' COMMENT 'a',
      `b` int(11) NOT NULL DEFAULT '0' COMMENT 'b',
      `updated_ts` timestamp(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000' ON UPDATE CURRENT_TIMESTAMP(6),
      `created_ts` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    插入大量数据,模拟大事务

    首先插入一条记录

    insert into apple_test(`a`, `b`) values(1,1);
    
    • 1

    接着反复执行如下SQL,插入大量数据记录

    insert into apple_test(a, b) select a,b from apple_test;
    
    • 1

    在反复执行的过程中,我们会发现,执行耗时越来越长。
    这是因为每次插入的数据量越来越大。

    例如,当我们多次执行,数量达到8388608时,

    select count(*) from apple_test;
    +----------+
    | count(*) |
    +----------+
    |  8388608 |
    +----------+
    1 row in set (1.87 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    再次执行插入时,耗时会是几十秒,甚至几分钟:

    insert into apple_test(a, b) select a,b from test_test;
    Query OK, 8388608 rows affected (1 min 20.68 sec)
    Records: 8388608  Duplicates: 0  Warnings: 0
    
    • 1
    • 2
    • 3

    实际上,上面的插入语句,就是一个事务。

    执行过程耗时较长时,模拟的也就是大事务。

    查看大事务

    select a.trx_started,now(),(UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(a.trx_started)) diff_sec,b.id,b.user,b.host,b.db,d.SQL_TEXT from information_schema.innodb_trx a inner join information_schema.PROCESSLIST b on a.TRX_MYSQL_THREAD_ID=b.id and b.command in('Query', 'Sleep', 'Connect') inner join performance_schema.threads c ON b.id = c.PROCESSLIST_ID inner join performance_schema.events_statements_current d ON d.THREAD_ID = c.THREAD_ID;
    +---------------------+---------------------+----------+--------+-------------+------+------+----------+
    | trx_started         | now()               | diff_sec | id     | user        | host | db   | SQL_TEXT |
    +---------------------+---------------------+----------+--------+-------------+------+------+----------+
    | 2021-08-07 22:12:20 | 2021-08-07 22:13:26 |       66 | 808786 | system user |      | NULL | BEGIN    |
    +---------------------+---------------------+----------+--------+-------------+------+------+----------+
    1 row in set (0.01 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    五、大表带来的问题

    • 大表定义:单表超过千万行、文件超过10G
    • 大表对查询的影响:
      • 慢查询、
      • 区分度底、
      • 大量磁盘IO、
      • 建立索引需要很长的时间、
      • 修改表结构需要长时间锁表、
      • 影响正常的数据操作
    • 如何处理大表问题:
      • 分库分表把一张表分成多个小表。难点:分表主键的选择、分表后夸分区数据的查询和统计。
      • 大表的历史数据归档(前端增加历史查询)难点:时间点选择,如何进行归档操作

    六、在大促中数据库服务器

    • 数据库架构:主从复制、读写分离、集群等。
    • TPS:每秒处理事务的速度(一个事务三个过程)。
      • 用户请求服务器
      • 服务器内部处理
      • 服务器返回给用户。
    • QPS:是一台指定服务器每秒能够相应的查询次数。
    • 并发量:同一时间处理的请求的数量。
    • 连接数:和服务器进行连接,但大部分处于sleep状态,只有少部分在运行。
    • 并发量大,连接数大说明cpu空闲少繁忙。
    • 磁盘IO读写过高会对服务器性能能造成影响。
    • 不要在主库上数据库备份(磁盘读压力增大)。
  • 相关阅读:
    Azure - 机器学习企业级服务概述与介绍
    ExtJS 数据处理-Associations(关联)
    麒麟系统开发笔记(八):在国产麒麟系统上使用linuxdeployqt发布qt程序
    pyG教程
    SSM整合redis及redis的注解式开发和解决Redis缓存问题
    使用springcloud-seata解决分布式事务问题-2PC模式
    MySQL数据库四:MySQL数据库
    HTML入门零基础教程(五)
    计算机竞赛 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python
    java计算机毕业设计校内图书馆智能管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  • 原文地址:https://blog.csdn.net/u011397981/article/details/130877186