公司存在着很多跟数据库关联的产品,包括监控产线的一些业务管理系统,近期的某个项目给了我这方面的灵感,个人认为,客户现场在长期使用系统之后,必然会出现大数据量产生的情况,例如公检法的案卷信息积累,下图是近期实际项目过程中,10000条数据记录,浏览器前端产生的性能瓶颈,仅仅只是查询,在点击翻页的查询读取瞬间,CPU占用高达52%,浏览器出现严重卡顿现象.
对于用户来讲,我可以不要求你界面多么多么花哨,但是处理大数据量时候的严重卡顿必然会打击产品在用户心中的形象,何时才能重视性能!?
之前我有分享一个破解版的DataFactory,在实际项目应用中发现,该破解版十分不稳定-包括Mysql-ODBC的严重BUG(虽然可以通过更新ODBC版本进行解决),再加上其配置过程比较复杂,故放弃了使用,那么除了依赖于第三方工具,其实还有一种更好的方法,那就是直接编写存储过程,这里推荐使用一款SQL客户端工具-著名的navicat,本文最后将提供一个破解版本,暂未发现问题.
中午花了点时间写了下面的存储过程,有一定的参考价值和复用性,存储过程不复杂,带一个IN类型的参数,可以让我们指定生成的数据量,最后调用存储过程的时候直接输入参数即可。
------可以生成可控数据量的存储过程 CODE BODY------
CREATE DEFINER = CURRENT_USER PROCEDURE AddManyData
(
IN num int -- 可控参数,生成多少数据量
)
BEGIN
#Routine body goes here...
DECLARE mynumber VARCHAR(50); -- 声明一个number变量
DECLARE myname VARCHAR(50); -- 声明一个name变量
DECLARE myaddress VARCHAR(50); -- 声明一个address变量
DECLARE myreason VARCHAR(50); -- 声明一个reason变量
DECLARE totalnum int; -- 声明一个总数指针
DECLARE mytime VARCHAR(50);
DECLARE modifyday VARCHAR(50);
DECLARE occtime VARCHAR(50);
set totalnum=0; -- 设置总id数初始值
set mytime=NOW(); -- 获取当前时间
set modifyday=DATE_ADD(NOW(),INTERVAL 1 DAY); -- 设置修改日期
set occtime=DATE_SUB(NOW(),INTERVAL 2 YEAR); -- 设置案卷发生日期
select MAX(id) into totalnum FROM is_cases; -- 从案卷表中获取最大id号
set num=totalnum+num; -- 最大id号
set totalnum=totalnum+1; -- 从当前位置下一个id号开始插入数据
WHILE totalnum<=num DO
set mynumber=CONCAT('testanjuan',totalnum); -- 拼接测试数据
set myname=CONCAT('测试案卷名称',totalnum); -- 继续拼接测试数据
set myaddress=CONCAT('测试用地址',totalnum);
set myreason=CONCAT('测试用理由',totalnum);
INSERT INTO is_cases VALUES (totalnum,'2',NULL,'1',NULL,mynumber,myname,myaddress,myreason,NULL,occtime,mytime,modifyday,NULL,NULL,'1','0','0'); -- 开始执行插入
SET totalnum=totalnum+1; -- 继续循环递增
end WHILE;
END
这里推荐使用Navicat编写存储过程,自带代码高亮,还有complete word
最后,我们检查一下,代码运行是否成功,可以看到,该存储过程已经为我们生成了大量有用数据,处理时间不足1S,生成数量10000条。
有了大数据量,我们就可以回到浏览器前端进行监控,观察其查询性能,做长拷测试,得到HTTP响应速度值,从而帮助我们找出系统的性能瓶颈,例如,一个分页功能,使用存储过程分页和在前端处理分页的效率是不一样的。
小生一点拙见,欢迎拍砖,工具附件请自行下载
PS:⊙﹏⊙b汗。。附件>20MB,需要的同事留言索取吧~