硬件配置:
3台服务器:192.168.23.168, 192.168.23.169, 192.168.23.170
硬盘:230G
内存:16G
Linux内核:Linux geoserver.csdb.cn 2.6.32-131.17.1.el6.x86_64 #1
操作系统:Scientific Linux release 6.1 (Carbon)
软件工具:
Mysql5.1 (存储引擎Myisam)
Mysqlslap(测试工具)
数据库和表
CREATE DATABASE myisamtest;
CREATE TABLE `t1_disk` (
`f1` int(10) NOT NULL AUTO_INCREMENT,
`f2` datetime DEFAULT NULL,
`f3` varchar(200) DEFAULT NULL,
PRIMARY KEY (`f1`)
) ENGINE=myisam
AUTO_INCREMENT=1000001 DEFAULT CHARSET=gbk;
字段f1有索引,f3无索引
数据记录:
1亿条记录
2亿条记录
一 数据插入测试
测试场景:
定义一个插入10000条记录的存储过程,如下:
DELIMITER $$
DROP PROCEDURE IF EXISTS `p_test_t1_disk` $$
CREATE DEFINER=`root`@`%` PROCEDURE `p_test_t1_disk`()
BEGIN
declare i int default 0;
test: loop
insert into ndbtest.t1_disk(f2,f3) values(sysdate(),md5(rand()));
set i=i+1;
if i>=10000 then
leave test;
end if;
end loop;
END $$
DELIMITER ;
然后使用测试工具mysqlslap执行测试:
mysqlslap --concurrency=200 --iterations=1 --query="call myisamtest.p_test_t1_disk;" --number-of-queries=10000 -uroot -p1234 -h 192.168.23.168 --create-schema=myisamtest
测试用例 |
1亿 |
2亿 |
开200个并发线程同时插入数据 |
每线程执行50次存储过程(200*50*10000记录) 用时10212.541 seconds(约2小时50分) |
每线程执行100次存储过程(200*100*10000记录) 用时20125.405 seconds(约5小时35分) |
|
|
|
|
|
|
二 数据查询单线程测试
直接执行测试例SQL语句测试:
测试用例 |
1亿 |
2亿 |
select * from t1_disk where f1=70000000 在int类型主键字段上做查询 |
<100ms |
<100ms |
select * from t1_disk limit 100 offset 70000000 在int类型主键字段上做分页查询 |
12.516s |
13.141s |
select * from t1_disk where f3='060a5524f33ac10345ce187df848c56e' 在varchar类型字段上做查询,查询某条记录 |
19.625s |
41.094s(因为没有索引,应该是把数据表从头到尾扫描了一次,因为查询任何一条记录时间都跟这差不多) |
select * from t1_disk where f3 like '42663%' |
返回101条记录,用时19.843s |
返回187条记录,用时42.656s |
select * from t1_disk where f3 like 'f45ce016bb84dac06%' 条件字串加长 |
返回1条记录,用时19.391s |
返回1条记录,用时40.953s |
select * from t1_disk where f3 like '%16bb84%' |
返回167条记录,用时46.438s |
返回330条记录,用时100.859s |
结论:
- f1是主键字段,做了唯一索引,1亿条和2亿条的查询区别不大。
- f3字段是varchar类型,没有做索引,每次查询都把数据表从头到尾扫描了一次,因为查询任何一条记录(无论第1条或者最后一条记录)时间都差不多。
- 前缀like查询(‘aaa%’)跟精确查询性能差不多,都是从头到尾扫描一次,而且条件字符串加长性能不受影响。
- 双端like查询(‘%aaa%’),性能下降很快。
三 数据查询并发测试
使用测试工具mysqlslap执行测试:
mysqlslap --concurrency=100 --iterations=1 --query=" select * from t1_disk where f1=7000000
;" --number-of-queries=100 -uroot -p1234 -h 192.168.23.168 --create-schema=myisamtest
测试用例 |
1亿 |
2亿 |
select * from t1_disk where f1=70000000 100并发查询 |
<100ms |
458ms |
select * from t1_disk limit 100 offset 70000000 100并发查询 |
返回100条记录,用时319.812s |
返回100条记录,用时313.973s |
select * from t1_disk where f3='060a5524f33ac10345ce187df848c56e' 100并发查询 |
519.735s |
1014.375s |
select * from t1_disk where f3 like '42663%' 100并发查询 |
返回101条记录,用时518.078s |
返回187条记录,用时1068.359s |
select * from t1_disk where f3 like '%16bb84%' 100并发查询 |
返回167条记录,用时1188.484s |
返回330条记录,用时2417.360s |
结论:按主键精确查询性能与单线程比较变化不大,主健分页、varchar查询性能下降厉害。
四 数据双机集群测试
将192.168.23.168设置在master机,192.168.23.169设置成slave机,调用插入测试语句
mysqlslap --concurrency=100 --iterations=1 --query="call myisamtest2.p_test_t1_disk;" --number-of-queries=1000 -uroot -p1234 -h 192.168.23.168 --create-schema=myisamtest2
100个并发在master机上插入1000万条记录,用时1932.188秒
同时,slave机同步插入了1000万记录,几乎没有延时