我们有时需要测试一个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