首页 > 数据库 >MySQL中查询和事务的大小

MySQL中查询和事务的大小

时间:2023-08-20 15:55:42浏览次数:38  
标签:事务 TRANSACTION SQL COUNTER bytes 查询 set sec MySQL

有时候了解事务的大小非常重要,尤其是当计划迁移到HA环境,为了保证集群的最佳性能,事务的大小是有限制的。

这里来尝试分析一下了解事务大小的不同方法。

首先要将事务分成两种类型:
1.生成数据的事务(写操作,比如insert、delete、update等DML操作)
2.只读的事务(查询操作)

在HA环境,第一类事务很重要。

 

DML的大小
分析DML事务的大小,唯一的可能方法是解析二进制日志(即查看binlog event)
例如,检查GTID为005fcb39-eb11-11ed-9aec-005056b0aaa3:75506865对应事务的大小。

SQL > pager grep 'Gtid\|COMMIT' ;
PAGER set to 'grep 'Gtid\|COMMIT''
SQL > show BINLOG EVENTS in 'binlog.000339' ;
| binlog.000339 | 25548333 | Gtid           |     25031 |    25548412 | SET @@SESSION.GTID_NEXT= '005fcb39-eb11-11ed-9aec-005056b0aaa3:75506865'   |
| binlog.000339 | 25551637 | Xid            |     25031 |    25551668 | COMMIT /* xid=3158707078 */                                                |
SQL > pager
Default pager wasn't set, using stdout.
SQL > select format_bytes(25551637-25548333);
+---------------------------------+
| format_bytes(25551637-25548333) |
+---------------------------------+
| 3.23 KiB                        |
+---------------------------------+
1 row in set (0.00 sec)

这样可以计算出binlog event的大小。
但是这个方式还是有点麻烦,尤其是要想找出某个事务的大小,可能需要查看多个binlog日志文件。

幸运的是,Performance_Schema能让我们的工作再次变得更轻松。事实上,我们可以通过解析表binary_log_transaction_compression_stats,获得有关事务大小的信息。即使我们不开启二进制日志压缩,也可以使用:

select format_bytes(UNCOMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) size,
       format_bytes(COMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) compressed,
       TRANSACTION_COUNTER 
  from performance_schema.binary_log_transaction_compression_stats;
+----------+------------+---------------------+
| size     | compressed | TRANSACTION_COUNTER |
+----------+------------+---------------------+
| 4.16 KiB | 4.16 KiB   |              844750 |
+----------+------------+---------------------+
1 row in set (0.00 sec)

这里的TRANSACTION_COUNTER列非常重要,因为如果它大于 1,则表示值是平均值。

因此,如果确实需要知道一个事务的确切大小,就需要在运行DML之前先truncate该表。

让我们看看这个示例:

SQL> select format_bytes(UNCOMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) size,
       format_bytes(COMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) compressed,
       TRANSACTION_COUNTER 
  from performance_schema.binary_log_transaction_compression_stats;
+-----------+------------+---------------------+
| size      | compressed | TRANSACTION_COUNTER |
+-----------+------------+---------------------+
| 48.39 MiB | 48.39 MiB  |                   9 |
+-----------+------------+---------------------+
1 row in set (0.0004 sec)

SQL > truncate table performance_schema.binary_log_transaction_compression_stats;
Query OK, 0 rows affected (0.0040 sec)

SQL > update emp set age=age+2;
Query OK, 982563 rows affected (6.3273 sec)

Rows matched: 982563  Changed: 982563  Warnings: 0

SQL > select format_bytes(UNCOMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) size,
       format_bytes(COMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) compressed,
       TRANSACTION_COUNTER 
  from performance_schema.binary_log_transaction_compression_stats;
+-----------+------------+---------------------+
| size      | compressed | TRANSACTION_COUNTER |
+-----------+------------+---------------------+
| 87.30 MiB | 87.30 MiB  |                   1 |
+-----------+------------+---------------------+
1 row in set (0.0012 sec)

此外,还可以使用 MySQL Shell Plugin列出binlog中的binlog事件。

 JS > check.showTrxSizeSort()
Transactions in binary log binlog.000339 orderer by size (limit 5):
3.23 mb - 005fcb39-eb11-11ed-9aec-005056b0aaa3:75506844
3.23 mb - 005fcb39-eb11-11ed-9aec-005056b0aaa3:75506845
3.23 mb - 005fcb39-eb11-11ed-9aec-005056b0aaa3:75506846
3.23 mb - 005fcb39-eb11-11ed-9aec-005056b0aaa3:75506847
257 bytes - 005fcb39-eb11-11ed-9aec-005056b0aaa3:75506848

MySQL Shell Plugin的下载地址:

https://github.com/lefred/mysqlshell-plugins/wiki/check#showtrxsizesort

 

如何找出我的事务对应的GTID

SQL > set session_track_gtids='OWN_GTID';
Query OK, 0 rows affected (0.0011 sec)

SQL > update emp set age=age+1;
Query OK, 982563 rows affected (6.7834 sec)

Rows matched: 982563  Changed: 982563  Warnings: 0
GTIDs: 005fcb39-eb11-11ed-9aec-005056b0aaa3:75506898

 

SELECT的大小
通过统计mysql server发送给mysql client的字节量来计算select语句的事务大小:

> select count(*) from emp ;
+----------+
| count(*) |
+----------+
|   172583 |
+----------+
1 row in set (48.22 sec)

> select variable_value 
       from performance_schema.status_by_thread 
        join performance_schema.threads using(thread_id) 
       where processlist_id=CONNECTION_ID() 
         and variable_name='Bytes_sent' into @before;
Query OK, 1 row affected (0.00 sec)

> select * from emp ;

> select format_bytes(variable_value - @before) query_size 
         from performance_schema.status_by_thread 
         join performance_schema.threads using(thread_id) 
        where processlist_id=CONNECTION_ID() 
          and variable_name='Bytes_sent' ;
+------------+
| query_size |
+------------+
| 42.81 MiB  |
+------------+
1 row in set (0.00 sec)

标签:事务,TRANSACTION,SQL,COUNTER,bytes,查询,set,sec,MySQL
From: https://www.cnblogs.com/abclife/p/17643270.html

相关文章

  • MySql Workbench 迁移工具 migration 提示缺少pyodbc 2.1.8 的解决方法
    想把公司的数据库转到MySQL,所以想装个MySQL测试,发现新版的MySQL(8.0.34)默认安装还是有不少问题,##一、譬如表、字段大小写的问题:lower_case_table_names=0--表名存储为给定的大小和比较是区分大小写的(linux默认)lower_case_table_names=1--表名存储在磁......
  • 为什么NoSQL不支持事务
    为什么NoSQL不支持事务1.背景看书《Neo4j权威指南》的时候,发现个问题:日常的NoSQL都不支持事务(ACID)。2.问题事务对数据的存储过程是有利的,既然事情是有利的,理论上存储型数据库都应该支持事务。但事实上是只有很少的一部分数据库支持事务,比如MySQL,Neo4j,并且MySQL也只有部分存......
  • rhel 6.5搭建MySQL 5.5.18一主一从高可用架构
    文档课题:rhel6.5搭建MySQL5.5.18一主一从高可用架构.系统:rhel6.564位数据库:MySQL5.5.18数据库安装包:mysql-5.5.18.tar.gzXtrabackup安装包:percona-xtrabackup-24-2.4.6-2.el6.x86_64.rpm架构信息如下:1、主从搭建1.1、前期准备安装两台MySQL数据库主机后,配置好主机IP地......
  • Centos安装MySQL数据库
    写在前面本文使用的root账户进行操作,若不是root账户需要在操作前加上sudo大家一定要注意数据库安全问题啊......
  • MySQL中的事务基础
    事务的ACID特性MySQL中的事务指的是在数据库操作中,将一组SQL语句作为一个不可分割的执行单元进行处理的机制。事务具有原子性、一致性、隔离性和持久性的特性(ACID特性)。原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部失败回滚。如果事务执行过程中发生错误或中断,系统......
  • TiDB dumpling 导出MySQL 数据遇异常
    最近在学习研究TiDB数据库运维,据介绍逻辑导出工具dumpling是可以兼容MySQL数据库的,于是进行了测试数据库版本信息如下: 新建了两张表t1,t2: 利用存储过程批量插入500000行记录:dropPROCEDUREp_load2;delimiter$$createPROCEDUREp_load2(INtbnamevarchar(64),IN......
  • 一次Greenplum 查询性能优化
    最近接手一个实际查询调优的活儿,对方说Greenplum的性能太弱了,于是按网上教程调整了许多参数。当然,有些有点儿用,有些没什么用。于是几经周折。我们首先做了硬件设备的性能测试,就用Greenplum自带的工具进行:gpcheckperf-fall_segments-S512G-d/gpdata因为偷懒,就没测那么大。......
  • PHP查询MySQL 数据库后返回中文为问号
    面向对象1$conn=newmysqli($servername,$user,$password);3增加$conn->query("setnamesutf8");$pdo=newPDO("mysql:host=$servername",$username,$password);增加$pdo->query("setnamesutf8");  面向过程$conn=mysql......
  • mybatis设置命名格式转换 与 批量插入更新&select查询返回自定义实体类 的sql写法
    在mybatis的配置文件中设置了Java实体类驼峰命名与表属性下划线命名的自动转换。在mybatis中,从接口获取到大量数据之后,将数据集合分批量插入更新到表中。在mybatis中,select查询表数据,返回数据的存储类型为自定义的实体类。1.设置Java实体类驼峰命名与表属性下划线......
  • MySQL基本SQL语句1(DDL)
    前言SQL(StructuredQueryLanguage)结构化查询语言,用于存取,查询,更新数据以及管理关系型数据库系统SQL指令分为四类DDL        DataDefintionlanguage数据库定义语言                用于完成对数据库对象(数据表,数据库,视图,索引)的创建,删除,修改DML......