进行压测时需要创建一个事务包含数据的大小为1MB。如何计算事务中的数据大小?要是能够使用大字段,就好办使用lpad函数填充字段值,使其为1MB。但表中无大字段,表结构如下:
CREATE TABLE tstudent
(
studentID
int(15) NOT NULL,
Sname
varchar(10) DEFAULT NULL,
sex
char(1) DEFAULT NULL,
cardID
varchar(20) DEFAULT NULL,
Birthday
date DEFAULT NULL,
Email
varchar(40) DEFAULT NULL,
Class
varchar(20) DEFAULT NULL,## 标题
enterTime
datetime DEFAULT NULL,
remarks
mediumtext
PRIMARY KEY (studentID
),
KEY pri_stuid
(studentID
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8`
造多少条数据能达到1MB?如果知道1000条数据占用的大小就知道总的数据条数。计算方式:
1MB/(1000条数据的大小)*1000。
然后使用存储过程进行创建数据。
表建好后插入一千条数据,想到的是利用mysql自带的schema.tables表来计算。计算方式如下:
select sum(DATA_LENGTH)+sum(INDEX_LENGTH) from information_schema.tables
where table_schema=‘数据库名’ and table_name=‘表名’;。
本以为搞定,结果这样计算出来的大小比实际小。
发现过程:
另一个表中有一个text字段,利用LPAD函数进行填充,填充为1MB。
写法如下:
LPAD(CONVERT(“lipp3”,CHAR(1048576)),1048576,‘0’)。
利用上述计算方式计算出来的数据大小是16KB。把内容从mysql中copy出来放在text文档显示是1MB。
于是改写了计算方式。方式如下:
在插入数据之前,执行show master status;看一下position的位置。插入数据执行之后再执行一下show master status。利用第二次的position减去第一次的position得到的差值便是这么多条数据的大小(单位是B,一定确保此时的数据库没有其他人进行数据的增删改操作)。
注意事项:
①一定开启binlog日志。在my.ini配置增加
log-bin=mysql-bin
binlog-format = ROW
server_id=20190911
其中server_id是唯一的就行。
②若第一次show master status的file名与第二次的不一致。产生的原因是binlog文件大小已经达到设置的大小,需要另外产生一个binlog文件。解决办法如下:
方法一:
可再插入一批数据,再计算差值。
方法二:
此时需要查看binlog文件大小show variables like ‘max_binlog_size’。拿这个值加上第二次的position的值再减去第一次的position值,即是插入数据的大小。show matser status的格式如图:
③如果mysql的用户不具有root权限。即用户只能对某些库某些表有操作权限。在执行show master status时会报错,报错如图:
需要用root用户执行下面两条语句。赋给用户获取binlog的权限。
grant replication client on . TO ‘用户名’@‘localhost’ identified by ‘密码’;
flush PRIVILEGES;
每篇一语
走自己的忍道,循序渐进地寻找问题的答案。