【发布时间】:2015-04-15 11:34:11
【问题描述】:
我有一个有 10k 行的 posts 表,我想通过它创建分页。因此,我为此目的进行了下一个查询:
SELECT post_id
FROM posts
LIMIT 0, 10;
当我 Explain 该查询时,我得到下一个结果:
所以我不明白为什么 MySql 需要遍历 9976 行才能找到前 10 行?如果有人帮助我优化此查询,我将非常感激。
我也知道MySQL ORDER BY / LIMIT performance: late row lookups那个话题,但是即使我把查询修改为下一个,问题依然存在:
SELECT t.post_id
FROM (
SELECT post_id
FROM posts
ORDER BY
post_id
LIMIT 0, 10
) q
JOIN posts t
ON q.post_id = t.post_id
更新
@pala_ 的解决方案非常适合上述简单情况,但现在我正在使用inner join 测试更复杂的查询。我的目的是将评论表与 post 表连接起来,不幸的是,当我解释新查询时仍然遍历 9976 行。
Select comm.comment_id
from comments as comm
inner join (
SELECT post_id
FROM posts
ORDER BY post_id
LIMIT 0, 10
) as paged_post on comm.post_id = paged_post.post_id;
你知道这种 MySQL 行为的原因是什么吗?
【问题讨论】:
-
为什么你需要一个派生部分并加入为什么不只是一个查询
select ..limit -
这是他的第一个查询,他正在比较它们
标签: mysql sql performance limit