为什么要测试:
- 新装的服务器,为了模拟将来业务达到一定程度时数据库大致的一个性能状况。
- 服务器进行了硬件升级,性能比原来快了么。
- mysql进行参数调优,到底什么才是比较优的。
mysqlslap是一个诊断程序,旨在模拟MySQL服务器的客户端负载并报告每个阶段的时间。它就像多个客户端正在访问服务器一样。
mysqlslap分三个阶段运行:
- 创建架构,表以及可选的任何存储程序或数据以用于测试。此阶段使用单个客户端连接。
- 运行负载测试。此阶段可以使用许多客户端连接。
- 清理(如果指定,则断开连接,删除表)。此阶段使用单个客户端连接。
思路:使用excel快速生成可测试的sql语句去测试。
使用excel配置参数过程中,应充分考虑生产中的实际并发与语句执行情况后进行配置。我在测试过程中,模拟500个客户端,请求五千次左右。
↑上图excel很简单,通过公式,生成可执行脚本,然后复制到SSH命令行↓
执行结果查看↓
-------------↑以上是针对数据库自动测试的一个思路,还可以自己建表,用自己的sql语句进行测试------------------------------------
以下是自己建表手动测试,mysqlslap也能自己建表,但他每次都删,不便于我们观察,我们自己创建一些表,然后使用自己的sql来进行测试。
创建2个表,class表插入2000条数据,person表插入10000000(一千万)条数据。插入数据用mysql的函数。person表中通过classid进行关联。然后写出带左连接的语句进行测试。
创建class表:
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`C1` varchar(255) DEFAULT NULL,
`C2` varchar(255) DEFAULT NULL,
`C3` varchar(255) DEFAULT NULL,
`C4` varchar(255) DEFAULT NULL,
`C5` varchar(255) DEFAULT NULL,
`C6` varchar(255) DEFAULT NULL,
`C7` varchar(255) DEFAULT NULL,
`C8` varchar(255) DEFAULT NULL,
`C9` varchar(255) DEFAULT NULL,
`C10` text,
`C11` text,
`C12` text,
`C13` text,
`C14` text,
`C15` text,
`C16` text,
`C17` text,
`C18` text,
`C19` text,
`C20` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS=1;
创建person表:
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`classid` bigint(20) NOT NULL,
`fname` varchar(200) NOT NULL,
`lname` varchar(1000) NOT NULL,
`age` tinyint(3) unsigned NOT NULL,
`sex` tinyint(1) unsigned NOT NULL,
`i1` float(255,2) DEFAULT NULL,
`i2` float(255,2) DEFAULT NULL,
`i3` float(255,2) DEFAULT NULL,
`i4` float(255,2) DEFAULT NULL,
`i5` float(255,2) DEFAULT NULL,
`i6` float(255,2) DEFAULT NULL,
`i7` float(255,2) DEFAULT NULL,
`i8` float(255,2) DEFAULT NULL,
`i9` float(255,2) DEFAULT NULL,
`i10` float(255,2) DEFAULT NULL,
`t1` text,
`t2` text,
`t3` text,
`t4` text,
`t5` text,
`v1` varchar(255) DEFAULT NULL,
`v2` varchar(255) DEFAULT NULL,
`v3` varchar(255) DEFAULT NULL,
`v4` varchar(255) DEFAULT NULL,
`v5` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS=1;
插入class表2000条:
通过函数
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=2000 DO
INSERT INTO class(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20)
VALUES(CONCAT('测试数据',FLOOR(RAND()*100)),CONCAT('测试数据',FLOOR(RAND()*100)),CONCAT('测试数据',FLOOR(RAND()*100)),CONCAT('测试数据',FLOOR(RAND()*100)),CONCAT('测试数据',FLOOR(RAND()*100)),CONCAT('测试数据',FLOOR(RAND()*100)),CONCAT('测试数据',FLOOR(RAND()*100)),CONCAT('测试数据',FLOOR(RAND()*100)),CONCAT('测试数据',FLOOR(RAND()*100)),
CONCAT('测试数据',FLOOR(RAND()*99999999)),CONCAT('测试数据',FLOOR(RAND()*99999999)),CONCAT('测试数据',FLOOR(RAND()*99999999)),CONCAT('测试数据',FLOOR(RAND()*99999999)),CONCAT('测试数据',FLOOR(RAND()*99999999)),CONCAT('测试数据',FLOOR(RAND()*99999999)),CONCAT('测试数据',FLOOR(RAND()*99999999)),CONCAT('测试数据',FLOOR(RAND()*99999999)),CONCAT('测试数据',FLOOR(RAND()*99999999)),CONCAT('测试数据',FLOOR(RAND()*99999999)),CONCAT('测试数据',FLOOR(RAND()*99999999)));
SET i = i+1;
END WHILE;
END
插入person表10000000(一千万)条:
注意,是有参数输入的↑
插入脚本:
BEGIN
DECLARE chars varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE fname VARCHAR(25) DEFAULT '';
DECLARE lname VARCHAR(25) DEFAULT '';
DECLARE id int UNSIGNED;
DECLARE len int;
set id=1;
WHILE id <= num DO
set len = FLOOR(1 + RAND()*25);
set fname = '';
WHILE len > 0 DO
SET fname = CONCAT(fname,substring(chars,FLOOR(1 + RAND()*62),1));
SET len = len - 1;
END WHILE;
set len &