【问题标题】:mysql performance of joins with limit and offset具有限制和偏移的连接的mysql性能
【发布时间】:2012-02-19 20:07:45
【问题描述】:

热身。 A 有数百万条记录,B、C、D... 更小(数千条)

SELECT ... FROM A LEFT OUTER JOIN B ... LIMIT 1000 OFFSET 0;

这在

SELECT ... FROM A LEFT OUTER JOIN B ... LIMIT 1000 OFFSET 1000000;

这会在 > 4 秒后返回

假设按 A 的 PK 排序,并且所有连接都正确索引,我会假设这 2 个操作应该具有相似的性能,但根据偏移量看起来它的 O(N)...

查询计划不应该是先从A中选择1000个然后进行join吗?我将仅 A 的选择与两个不同的偏移量进行了比较,时间差远小于 1 秒,因此不应解释给定连接的时间差异。

这是mysql查询计划优化器的缺陷吗?

【问题讨论】:

标签: mysql


【解决方案1】:

由于您没有提及ORDER BY 子句,因此可以在第一个查询的限制中规定的 1,000 条记录后停止查询。第二个查询速度较慢,因为必须生成 1,001,000 条记录,然后只返回最后 1,000 条。

希望对您有所帮助。

【讨论】:

  • 实际上,没有明确的 order by,我相信 mysql 只会使用 PK 进行排序。我在最初的测试中确实尝试了按 PK 子句排序,并且对时间没有影响。
  • 您是否尝试按另一列排序(不是 PK)?
猜你喜欢
  • 2019-06-05
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2016-06-18
  • 2021-12-29
  • 2012-09-22
相关资源
最近更新 更多