千万级用户
当用户量很大的时候,第二种方法也不行了,因为但凡每个系统,都有大量无效用户,即长期不在线之类的这种的。
那我们每次还要给他插入一条状态数据,是不是很没有必要?
表名:letter
id,manager_id(管理员id),user_id(用户id,为0则是全部用户),content(站内信内容),create_at(发送时间)
表名:letter_status
id,user_id(用户id),letter_id(站内信的id),status(状态查看状态)
letter表的user_id字段,需要存储为id,id,id的格式,例如3,15,23,45,把用户的id已逗号分隔的形式存储。
letter_status表不操作。
这样,当用户登录的时候,证明该用户为有效用户,查询遍历letter表,查询user_id为0或者当前用户id在user_id中的站内信,可以用mysql的find_in_set('str', filed)查询。
比如当前用户的id为1;
SQL语句:
SELECT * FROM letter
WHERE user_id=0 OR find_in_set(1, user_id);
查询出来存在有站内信后,查询letter_status是否已经存在该条站内信,并且user_id是否为当前用户。 如果不存在,则插入一条到letter_status,这样用户就有一条未读站内信了。
也可以用关联查询:
SELECT letter
.*,letter_status
.id AS status_id FROM letter
LEFT JOIN leter_status
ON letter
.id=leter_status.letter_id
WHERE letter
.user_id=0 OR find_in_set(1, letter
.user_id);
查询出来数据集后,遍历所有查询出的站内信,判断status_id是否为空,如果为空,就插入这条站内信的内容到ld_status里面,两种SQL查询的方式不同,不过只是把两次查询简化成了关联查询,但是达到的目的都是一样的。
网友评论