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

MySql模拟数据测试数据库性能

2017-01-14 16:02 585 查看
我们有时需要测试一个sql语句的性能,但是如果表中数据量太小,又测不出效果。下面用存储过程来添加假数据
创建一个表,只是为了测试数据,所很多表的字段合在一起并删改了!!
-- --------------------------------------------
-- 店铺信息
-- --------------------------------------------
DROP TABLE IF EXISTS store;
CREATE TABLE store (
id int(10) auto_increment , --店铺ID
title varchar(64) , --商家名称
logo varchar(128), --商家logo
description varchar(1024) default NULL, --店铺描述(外送时间)
regTime date default NULL, --注册时间
phone varchar(64), --固定电话
mobilephone varchar(64), --移动手机
address varchar(256) , --地址
longitude double , --经度
latitude double , --纬度
commercialCircle varchar(64) default NULL, --商业圈
registerNum varchar(16), --注册号
workTime varchar(64) default NULL, --营业时间(时间段,前台封装)
businessLicenceImage varchar(256) default NULL, --营业执照照片
idCard varchar(19) , --身份证号
idCardImage varchar(64), --身份证照片(正反两张)
clickCount int(6) default 0, --浏览次数
visible tinyint(1) default 1, --是否可见
shopkeeper varchar(20), --店主
note varchar(256), --广告语
userId int(10) , --所属用户或单位
storeTypeId int(10), --所属类别
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10000000;

写一个生成指定位数字符串的函数:
--随机产生字符串
delimiter $$
drop function rand_string $$
--rand_string(n INT) rand_string 是函数名 (n INT) --该函数接收一个整数(返回的字符个数)

create function rand_string(n INT)
returns varchar(255) --该函数会返回一个字符串
begin
declare chars_str varchar(100) default
'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ参加了爱和希望,你懂得,永远。';
declare return_str varchar(255) default '';
declare i int default 0;
while i < n do
set return_str =concat(return_str,substring(chars_str,floor(1+rand()*67),1)); --随机取出一个数
set i = i + 1;
end while;
return return_str;
end $$
delimiter ;

模拟一个手机号码(这里也可以写一个指定生成指定位数的整数)
-- 随机产生随进手机号码(11位)
delimiter $$
drop function rand_mobilephone $$

--这里我们又自定了一个函数
create function rand_mobilephone( )
returns bigint(11)
begin
declare i bigint default 0;
set i = 10000000000 + floor(10+rand()*10000000000);
return i;
end $$

delimiter ;
select rand_mobilephone();

-- 随机产生随进电话号码(8位)
delimiter $$
drop function rand_phone $$

--这里我们又自定了一个函数
create function rand_phone()
returns int(8)
begin
declare i int default 0;
set i = floor(10+rand()*100000000);
return i;
end $$

delimiter ;
select rand_phone();

-- 随机产生随机数(8位)
delimiter $$
drop function rand_num $$

--这里我们又自定了一个函数
create function rand_num( )
returns int(8)
begin
declare i int default 0;
set i = floor(10+rand()*100000000);
return i;
end $$

delimiter ;
select rand_num();
--根据大范围生成经度(n为大范围的经度 114--深圳)
delimiter $$
create function rand_longitude(n INT)
returns Decimal(14,11)
begin
return n+rand();
end $$
delimiter ;

--******************************************

--根据大范围生成纬度(n为大范围的经度 22--深圳)
delimiter $$
create function rand_latitude(n INT)
returns Decimal(14,12)
begin
return n+rand();
end $$
delimiter ;
--向store表中插入记录(海量的数据)

delimiter $$
drop procedure insert_store $$

--随即添加雇员[光标]  100w
create procedure insert_store(in max_num int(10))
begin
declare i int default 0;
--set autocommit =0 把autocommit设置成0
set autocommit = 0;
repeat
set i = i + 1;
insert into store values(null,rand_string(20),'http://www.baidu.com/sdfdf/aaa.jpg',
rand_string(100),now(),rand_phone(),rand_mobilephone(),
'深圳市宝安区西乡有限公司',
rand_longitude(114),rand_latitude(22),'金港华庭',rand_mobilephone(),'6:00-8:00',
'http://wwww.open.com/adf.jpg,http://www.open.com/sdf.gif','431121111111111111',
'http://localhost:8080/df/df.jpg',500,1,'xys',rand_string(50),rand_num(),rand_num());
until i = max_num
end repeat;
commit;
end $$
delimiter ;

--调用存储过程
call insert_store(1000000);

--测试数据
address: 深圳市宝安区金海路19号
latitude: 22.584639085728,
longitude: 113.86655497174,

--按照距离排序(比较精确)
SELECT
id,title,
ACOS(SIN((22.584639085728 * 3.1415)/180)*SIN((latitude * 3.1415)/180)+
COS((22.584639085728 * 3.1415)/180 )*COS((latitude * 3.1415)/180)*COS((113.86655497174 *3.1415)/180-
(longitude*3.1415)/180))*6380 as distance ,note
FROM store
order by distance ASC
LIMIT 1,25

--一共25W条数据,每次计算出离目的经纬度的距离,平均时间为1s
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: