有效地在SQL表中创建大量条目

时间:2013-07-07 23:33:40

标签: mysql subquery sql-insert

我正在构建一个RSS阅读器,在阅读帖子时会注意到(如Google阅读器所做的那样)。我把它工作到了这样的程度,当我向下滚动时,它通过在“读取文章”表中插入行来标记帖子,该表记录了读取的项目(ciid),读取它的用户({{1 }}和读取的日期(uid)。

现在,我正在考虑如何提供“Mark All As Read”功能。如果只有25篇未读文章,那就足够简单了。我查询了25篇文章的主要文章表 - 我有一个子查询来确定哪些文章未​​读 - 当前用户未读,收集需要标记为已阅读的dateRead并插入新的阅读条目。但是,如果有20,000个条目未读,该怎么办?检索20,000个未读条目,收集那些ciid然后发送回MySQL服务器20,000个插入命令似乎效率很低。

有没有更有效的方法来执行此操作,可能使用直接处理所有这些的SQL查询?如果系统中只有一个或两个用户,我猜我的低效方法不会有问题,但我希望系统能够相对较好地扩展。

1 个答案:

答案 0 :(得分:2)

您可以执行类似

的操作
REPLACE INTO read_articles (uid, dateread, ciid) 
SELECT <user-id>, NOW(), id FROM articles

您必须指定要插入的用户ID。 REPLACE INTO将删除任何现有的日期读取。如果您不想要这种行为,可以这样做

INSERT INTO read_articles (uid, dateread, ciid) 
SELECT <user-id>, NOW(), id FROM articles
ON DUPLICATE KEY UPDATE uid=uid;

但是,我认为您所采用的方法(以每篇文章为基础存储阅读文章)并不具备可扩展性。当用户单击标记所有时,您可以将该事件的日期时间存储在users表中。所有超过上次标记全日期的文章都被视为已阅读。

也许你应该只考虑表格中过去7天的文章,即。定期删除超过一周的read_articles记录。您忽略的所有超过7天的文章(实际上您认为它们已被阅读)。