【发布时间】:2014-01-09 21:14:40
【问题描述】:
此查询的目标是获取其他用户在某人的帖子上创建的最新 cmets。它应该包含评论的用户的姓名、他们评论的帖子的标题以及实际的评论文本。
一共有三个表,MySQL myisam:
comment: id, author_fk, post_fk, text, date, ...
post: id, author_fk, content, date, ...
user: id, name, ...
这就是我获取用户帖子上人们最近制作的 cmets 的方式:
SELECT comment.text, user.name, post.title
FROM comments
JOIN user ON user.id = comment.author_fk
JOIN post ON post.id = comment.post_fk
WHERE post.author_fk = [id of the user who posted content]
ORDER BY comment.id
LIMIT 20
这是我在执行此操作时引用的一个线程:mysql/php: show posts and for each post all comments
问题是这真的很慢。我正在使用一个拥有超过 200 万个帖子、1500 万个 cmets 和大约 50 万用户的数据库。应该应用什么样的索引策略?有没有更好的方法来编写查询?是否有可能让查询在几秒钟内返回结果?这似乎取决于用户的帖子数量。
非常感谢。
【问题讨论】:
-
您知道,当您达到这种规模时,可以得到一些专业支持。
-
@SamD 这是一个 AWS db.m1.small RDS 实例:1.7 GB 内存、1 个 ECU(1 个虚拟内核和 1 个 ECU)、64 位平台、中等 I/O 容量。所有的表都在使用 myisam。
-
如果您指定
INNER JOIN而不仅仅是JOIN,会发生什么?这应该至少会加快一点速度。另外,您目前在这三个表上有哪些索引?您上次分析这些表格是什么时候? -
请提供
EXPLAIN ...的输出以及您引用的3 个表的create table 语句。 -
@dg99 显式使用 INNER JOIN 并没有什么不同。从我在 EXPLAIN 中看到的内容来看,我的索引应该没问题,但是 post.author_fk、comment.author_fk、comment.post_fk、(comment.post_fk、comment.author_fk)、user.id 有一个。也许你可以分享你对如何索引这个的想法?该表是定期分析的,所以那里没问题
标签: mysql