视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL案例分享之系统消息_MySQL
2020-11-09 19:47:22 责编:小采
文档
 从前有个大师,率领一群徒弟,为客户做了一个软件系统。某天,客户提出了一个新的需求,向系统中的所有用户发送系统消息。由于当时系统刚上线不久,系统中的用户也就几十个。大师为了考验自己的徒弟,便将该需求分配给他的徒弟,要求每个人都做一套方案出来,于是便有了下面的故事。

徒弟们接收到该项任务后,每个人都想到了先建一张系统消息表,每次发送系统消息时,将数据保存在词表中,用户就能从该表中读取他个人的系统消息。用户信息表的模型如下:

基于上面的数据库模型,徒弟们分别作了不同的实现方案,如下:

实现方案一:

小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 id= "addBatchSysMessage" parameterType= "com.favccxx.favsoft.SysMessage" >

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 id= "addAllSysMessage" parameterType= "com.favccxx.favsoft.SysMessage" >

insert into sys_message ( MESSAGE_TITLE,

MESSAGE_CONTENT, MESSAGE_STATUS, RECEIVE_USER_ID,

RECEIVE_TIME, CREATE_USER_ID, CREATE_TIME

)

select

a.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_TIME

from sys_message_send_info a,

(

select user_id FROM auth_user

) b

where sendInfoId=#{sendInfoId}



1
int insertCount = sysMessageService.addAllSysMessage(sendInfoId);

  小D向系统中插入了10万个模拟用户,经测试,系统运行良好。以下是向113508个用户发送消息的花费时间。

下载本文
显示全文
专题