我们说我的数据库中有一个名为comments
的表。每个评论都有一个id,一个指定的帖子及其数据(用户提交的实际文本。)假设我有10,000个帖子,每个帖子有10条评论。这总共有100,000条评论。如果用户加载帖子及其评论。
我用来加载评论的代码是否会通过所有十万条评论来读取一条带有postID(或者说:)的11,或者它会立即看到有10条评论postID为11的注释并将它们删除(这比查看100,000条注释要快得多。在这种情况下,MySql做了什么?
答案 0 :(得分:0)
我建议在表定义中使用以下内容(以及其他列):
post_id INT UNSIGNED NOT NULL, -- for JOINing to Posts table
comment_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
PRIMARY KEY(post_id, comment_id), -- clusters all the comments together for a post
INDEX(comment_id) -- keeps AUTO_INCREMENT happy
并使用ENGINE=InnoDB
,以便PRIMARY KEY
与数据集群。
SELECT ...
WHERE post_id = 123
AND comment_id > 0 -- see note below
ORDER BY comment_id ASC
LIMIT 10
这样,所有10个注释都来自一个块(或者可能是非常少量的块),从而尽可能高效。
因为您的下一个问题是关于找到' next' 10条评论,我已经跳了过来。推荐阅读:This。 "请记住前10个评论的中断位置,然后将0
更改为找到的最后一个comment_id
。
我给了你很多关键词来研究和理解。在回到下一个问题之前,请先阅读手册。