怎么改进 MySQL 子查询中的 LIMIT 子句?
本教程将介绍如何改进 MySQL 子查询中的 LIMIT 子句?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
我有两个表:posts
有 10k 行和 comments
,我需要为特定数量的 posts 选择所有
comments
也就是通过posts
表实现分页,并获取其中的所有comments
.为此,我有下一个查询:
select * from comments c
inner join (select post_id from posts o order by post_id limit 0, 10) p
on c.post_id = p.post_id;
查询的性能对我来说也很重要.但是这个查询的 Explain
很奇怪,因为 LIMIT
子句遍历 9976 行
而不是像我预期的那样遍历 10 行:
同时,当我单独运行子查询时,它可以很好地按预期遍历 10 行:
explain select post_id from posts o order by post_id limit 0, 10
posts(post_id)、comments(comment_id)、comments(post_id)
上还有 indexes
.我不明白该查询有什么问题,因此它遍历了帖子表中的所有记录.如果有人帮助我解决这个问题,我将非常感激.
推荐答案
9976 (vs 10000) 已经是一个改进——在 5.6 之前,行"通常会减少多达 2 倍.现在统计数据是更准确,更稳定.
真正的答案是EXPLAIN
并不完美."
5.7 将有的改进.与此同时,我们还被10 vs 9976"之类的谜团所困.
当使用 LIMIT 时,它大多被破坏.它以另一种方式体现在 EXPLAIN EXTENDED
的已过滤"列中.
试试 EXPLAIN FORMAT=JSON ...
以获得更多信息.
使用 MariaDB(版本 10.0?),有 ANALYZE SELECT ...
可以为您提供计数.它通过运行查询,然后抛出结果集并保留统计信息来做到这一点.
好了关于怎么改进 MySQL 子查询中的 LIMIT 子句?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。