您的位置:首页 > 数据库 > MySQL

mysql快速生成测试数据的方法,以及分页limit语句优化

2018-06-14 15:17 776 查看
1、创建表:

person MyISAM

CREATE TABLE `person` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`fname` varchar(255) NOT NULL,
`age` tinyint(3) unsigned NOT NULL,
`sex` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


person1 InnoDB

CREATE TABLE `person1` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`fname` varchar(255) NOT NULL,
`age` tinyint(3) unsigned NOT NULL,
`sex` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


2、创建存储过程:

CREATE  PROCEDURE `generate`(IN num INT)
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;
#DELETE from person;
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;
INSERT into person VALUES (NULL,fname,FLOOR(RAND()*100), FLOOR(RAND()*2));
set id = id + 1;
END WHILE;
END


3、生成数据,可以不断添加不会清空原有数据:

generate(100000);


4、生成数据测试:

person:

第一次:

[SQL]CALL generate(100000);
受影响的行: 1
时间: 630.181s




第二次:连续两次10W

[SQL]CALL generate(100000);
受影响的行: 1
时间: 614.775s

[SQL]
CALL generate(100000);
受影响的行: 1
时间: 642.726s




第三次:300W

[SQL]CALL generate(3000000);
受影响的行: 1
时间: 3029.854s


person1: 300W

[SQL]call generate(3000000);
受影响的行: 1
时间: 3888.488s




5、查询测试:

测试代码:

SELECT * FROM person LIMIT 2800000,10;
SELECT * FROM person AS a INNER JOIN(SELECT id FROM person LIMIT 2800000,10) AS b ON a.id=b.id;

SELECT * FROM person AS a INNER JOIN(SELECT id FROM person LIMIT 2200000,10) AS b ON a.id=b.id;
SELECT * FROM person LIMIT 2200000,10;

SELECT * FROM person1 LIMIT 2800000,10;
SELECT * FROM person1 AS a INNER JOIN(SELECT id FROM person1 LIMIT 2800000,10) AS b ON a.id=b.id;

SELECT * FROM person1 AS a INNER JOIN(SELECT id FROM person1 LIMIT 2200000,10) AS b ON a.id=b.id;
SELECT * FROM person1 LIMIT 2200000,10;


测试结果:

[SQL]SELECT * FROM person LIMIT 2800000,10;
受影响的行: 0
时间: 1.175s

[SQL]
SELECT * FROM person AS a INNER JOIN(SELECT id FROM person LIMIT 2800000,10) AS b ON a.id=b.id;
受影响的行: 0
时间: 1.362s

[SQL]

SELECT * FROM person AS a INNER JOIN(SELECT id FROM person LIMIT 2200000,10) AS b ON a.id=b.id;
受影响的行: 0
时间: 1.046s

[SQL]
SELECT * FROM person LIMIT 2200000,10;
受影响的行: 0
时间: 0.891s

[SQL]

SELECT * FROM person1 LIMIT 2800000,10;
受影响的行: 0
时间: 2.230s

[SQL]
SELECT * FROM person1 AS a INNER JOIN(SELECT id FROM person1 LIMIT 2800000,10) AS b ON a.id=b.id;
受影响的行: 0
时间: 1.468s

[SQL]

SELECT * FROM person1 AS a INNER JOIN(SELECT id FROM person1 LIMIT 2200000,10) AS b ON a.id=b.id;
受影响的行: 0
时间: 1.183s

[SQL]
SELECT * FROM person1 LIMIT 2200000,10;
受影响的行: 0
时间: 1.738s


六、总结:

数据查找越往后的情况下:

MyISAM:关键字索引不起作用,不必优化;

InnoDB:有了关键字索引,快了30%;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐