什么是大事务?以及大事务产生的问题

专栏持续更新中:MySQL详解

一、定义

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

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

二、大事务风险

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

三、避免大事务

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

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

四、案例

创建表

建表sql

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;

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

首先插入一条记录

scss 复制代码
insert into apple_test(`a`, `b`) values(1,1);

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

css 复制代码
insert into apple_test(a, b) select a,b from apple_test;

在反复执行的过程中,我们会发现,执行耗时越来越长。

这是因为每次插入的数据量越来越大。

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

sql 复制代码
select count(*) from apple_test;
+----------+
| count(*) |
+----------+
|  8388608 |
+----------+
1 row in set (1.87 sec)

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

css 复制代码
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

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

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

查看大事务

sql 复制代码
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)

五、大表带来的问题

  • 大表定义:单表超过千万行、文件超过10G

  • 大表对查询的影响:

    • 慢查询、
    • 区分度底、
    • 大量磁盘IO、
    • 建立索引需要很长的时间、
    • 修改表结构需要长时间锁表、
    • 影响正常的数据操作
  • 如何处理大表问题:

    • 分库分表把一张表分成多个小表。难点:分表主键的选择、分表后夸分区数据的查询和统计。
    • 大表的历史数据归档(前端增加历史查询)难点:时间点选择,如何进行归档操作

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

  • 数据库架构:主从复制、读写分离、集群等。

  • TPS:每秒处理事务的速度(一个事务三个过程)。

    • 用户请求服务器
    • 服务器内部处理
    • 服务器返回给用户。
  • QPS:是一台指定服务器每秒能够相应的查询次数。

  • 并发量:同一时间处理的请求的数量。

  • 连接数:和服务器进行连接,但大部分处于sleep状态,只有少部分在运行。

  • 并发量大,连接数大说明cpu空闲少繁忙。

  • 磁盘IO读写过高会对服务器性能能造成影响。

  • 不要在主库上数据库备份(磁盘读压力增大)。

相关推荐
NCIN EXPE1 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台1 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
lUie INGA2 小时前
在2023idea中如何创建SpringBoot
java·spring boot·后端
极客on之路2 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家2 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE2 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow122 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO2 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
geBR OTTE2 小时前
SpringBoot中整合ONLYOFFICE在线编辑
java·spring boot·后端
m0_743623922 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python