我对Web开发(HTML,PHP,MySQL等)很陌生,并认为开发一个非常简单的留言板作为练习可能是个好主意。
我已经建立了一个数据库来存储我需要的一切。表格如下:
这只是一个基本结构;字段的数据类型可能远非最佳。
我现在正处于试图显示给定主题中的所有消息的位置。我这样做是让我的showthread.php通过$_GET['subjectID']
捕获主题ID。
我显然需要从db中获取所有相关信息,即作者的username
,postTime
等。
起初我通过以下方式解决了这个问题:
1。)获取所有带有subjectID的消息(一个查询)
2.)对于每条消息,获取用户信息
3.)通过COUNT(*)
然后我想也许我可以在一个查询中完成所有这些 - 事后我应该在users
表中定义一个帖子计数列,但是为了训练我继续没有该列。所以我继续创建了以下两个查询:
1)
SELECT message, postTime, username, signupdate, postcount FROM messages as m
INNER JOIN users AS u ON m.authorID = u.id
INNER JOIN (
SELECT COUNT(*) AS postcount, u.id FROM messages AS m INNER JOIN users AS u ON m.authorID = u.id
GROUP BY u.id
) AS c ON c.id = m.authorID WHERE m.subjectID = $subjectID ORDER BY m.ID ASC
2)
SELECT message, postTime, (
SELECT username FROM users WHERE users.id = om.authorID
) AS username, (
SELECT COUNT(*) FROM messages As im WHERE im.authorID = om.authorID
) AS posts
FROM messages As om WHERE subjectID = $subjectID ORDER BY om.id ASC;
如前所述,他们现在都在做这项工作。 我认为,一旦我的数据库变得足够大,第一个版本的执行效果会非常差,因为内部子查询总是查询所有用户的帖子数,无论他们是否发布了相关主题。 所以我想我的问题是这样的:查询数字2)对于不可忽略大小的数据库是否合理?如果没有,我可以使用哪些不同类型的查询?我感到有点不知所措,你可以解决SQL问题的角度,我担心我可能会遗漏一些东西。 也许性能甚至不是任何上述查询的问题,因为现在的MySQL实现足够智能? : - )
我很感激有关该主题的任何意见。请记住,我正在尝试解决此问题而不在我的users
表中引入额外的帖子计数字段。感谢。
答案 0 :(得分:1)
如果您担心性能问题,当您的查询持续数分钟时,最好创建一个视图或物化视图。
视图是使用查询构建的表。这意味着您可以创建一个视图,检索您提到的问题的所有必要数据(带来所有用户活动(帖子,消息等)并将其放在1个表中。这样,当您检索数据时,可以节省连接表的时间。
http://dev.mysql.com/doc/refman/5.7/en/create-view.html
中的更多信息实体化视图是常规表,它们完成视图的相同工作,您需要运行具有某些频率的cronjob来更新信息。
使用或两者取决于执行不同类型的CRUD操作的频率。您也可以使用索引来加速数据检索,但是在包含大量插入或删除的表中并不是一个好主意,因为这些操作会变慢。