怎么改进 MySQL 子查询中的 LIMIT 子句?

本教程将介绍如何改进 MySQL 子查询中的 LIMIT 子句?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

怎么改进 MySQL 子查询中的 LIMIT 子句? 教程 第1张

问题描述

我有两个表: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 子句?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。