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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值