用mysqlslap工具对华为GaussDb mysql版 16核64G版进行了性能测试
测试数据生成
//创建表
DROP TABLE IF EXISTS `test`;
create table test(id bigint AUTO_INCREMENT,data json ,PRIMARY KEY (`id`)) ;
// 生成虚拟列
alter table test add name varchar(50) generated always as(data->"$.name") virtual;
//添加索引
alter table test add index ix_name(name);
//创建存储过程,
DELIMITER $$
DROP PROCEDURE IF EXISTS `addTest`$$
CREATE PROCEDURE `addTest`(IN total int,IN body int)
BEGIN
DECLARE i INT UNSIGNED DEFAULT 1;
SET i=0;
set @str='asbhjakdshkjahgdkjghaskdhkhaskdjlasjldjlsajldjlksajdkljklasjdkhwoiqdknkasndkjbjkbacjskjcbkahkhsdihaskhdkhkahskdhkjhaskhdkhaskbdkbaskjbdkbkjbckbakbdjksajkdhkashkhjskdhkjaskbscxkjasbkqwoueiyrwqutyrurtu';
loop1: LOOP
SET i=i+1;
if i>total then
LEAVE loop1;
end if;
set @t=JSON_OBJECT("name",SUBSTRING(@str,FLOOR(rand()*(length(@str)/3-20)),5+FLOOR(rand()*body)));
insert INTO test(`data`) values (@t);
select i,total-i;
END LOOP loop1;
END$$
DELIMITER ;
//mysqlslap调用存储过程 100个并发 调用生成
./mysqlslap --create-schema="test" --query="call addTest(1000000,50)" --concurrency=50 -uroot -pxxx -h192.168.0.1
//测试读
//不走索引
select * from test where data->>'$.name' like 'a%'
//走索引
./mysqlslap --create-schema="test" --query="select * from test where name like '\"a%' limit 20" --c=100 -uroot -pxxx -h192.168.0.1
结论
1、gaussdb 写7000/s cpu 50% 内存20%
2、用存储过程生成测试数据效率较高
3、在1千万数据时不走索引查json数据 9s
4、在亿级数据量走虚拟列索引时单个查询0.2s 并发查询时效率有所下降 模拟200并发同时查询 1s多。前缀索引。
5、count 查询 select count(*) from test; 5s count查询还是一般般