您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

MySQL案例分享之系统消息_MySQL

2024/3/28 18:17:18发布5次查看
从前有个大师,率领一群徒弟,为客户做了一个软件系统。某天,客户提出了一个新的需求,向系统中的所有用户发送系统消息。由于当时系统刚上线不久,系统中的用户也就几十个。大师为了考验自己的徒弟,便将该需求分配给他的徒弟,要求每个人都做一套方案出来,于是便有了下面的故事。
徒弟们接收到该项任务后,每个人都想到了先建一张系统消息表,每次发送系统消息时,将数据保存在词表中,用户就能从该表中读取他个人的系统消息。用户信息表的模型如下:
基于上面的数据库模型,徒弟们分别作了不同的实现方案,如下:
实现方案一:
小a是个急性子,领到任务后。立即开始了他的编程思路:将系统中的所有用户都取出来,然后遍历所有的用户,每次迭代时插入一条系统消息。伪代码如下:
list userlist = favuserservice.getalluser();for (favuser favuser : userlist){sysmessage sysmessage = new sysmessage();...sysmessage.setreceiveuserid(favuser.getuserid());sysmessageservice.addsysmessage(sysmessage);}
由于系统中的用户较少,小a几遍测试,发现系统中运行良好,便将该方案提交了上去。
实现方案二:
小b接到任务后,想到应该先把系统中所有的用户ids取出来,然后遍历这些ids,每次迭代时都插入一条系统消息。基于此,小b的伪代码如下:
list useridslist = favuserservice.getalluserids();for (integer userid : useridslist ){sysmessage sysmessage = new sysmessage();...sysmessage.setreceiveuserid(userid);sysmessageservice.addsysmessage(sysmessage);}
由于系统中的用户较少,小b几遍测试,发现系统中运行良好,也将该方案提交了上去。
实现方案三:
小c接到任务后,考虑到每次插入的系统消息,除了用户id不同外,其余的数据项都相同,便想到了批量插入数据。由于mysql数据库支持批量插入数据,小c设计出了执行的sql语句与伪代码:
执行的sql语句如下:
insert into sys_message (message_title, message_content, message_status, receive_user_id, receive_time, create_time)values( #{item.messagetitle,jdbctype= varchar },#{item.messagecontent,jdbctype= varchar }, #{item.messagestatus,jdbctype= char }, #{item.receiveuserid,jdbctype= integer },#{item.receivetime,jdbctype= timestamp }, #{item.createtime,jdbctype= timestamp })
伪代码如下:
list userlist = favuserservice.getalluser();list datalist = new arraylist();for (favuser favuser : userlist){sysmessage.setreceiveuserid(favuser.getuserid());datalist.add(sysmessage);}list sublist = datalist.sublist( , );sysmessageservice.addbatchsysmessage(sublist);
小c向系统中添加了几千个模拟用户,测试系统运行良好。但发现将系统中的用户增加至几万时,发送系统消息速度明显变慢。于是,小c采用了分组的方式进行插入,每10,000条插入一次,系统运行良好。
实现方案四
小d接到任务后,考虑的也是批量插入数据,但与小c不同的是,他想通过执行一次sql完成批量插入数据。即先将待发送的消息存入数据库中,然后通过mysql查询并同时将数据插入系统消息。小d的mysql设计如下:
insert into sys_message ( message_title,message_content, message_status, receive_user_id,receive_time, create_user_id, create_time)selecta.message_title as message_title,a.message_content as message_content,as message_status,b.user_id as receive_user_id,now() as receive_time,now() as create_timefrom sys_message_send_info a,(select user_id from auth_user) bwhere sendinfoid=#{sendinfoid}1int insertcount = sysmessageservice.addallsysmessage(sendinfoid);
小d向系统中插入了10万个模拟用户,经测试,系统运行良好。以下是向113508个用户发送消息的花费时间。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录