【问题标题】:Behavior of LIMIT using JOIN clause使用 JOIN 子句的 LIMIT 行为
【发布时间】:2012-05-29 11:36:00
【问题描述】:

在 mysql 中,当您有 3 个表(大量数据)通过 JOIN 子句连接时,在 SELECT 末尾有一个 LIMIT 子句,sql 引擎生成表的笛卡尔积,然后应用 LIMIT,还是之前做过任何优化?

我问是因为如果我们使用大数据量,JOIN 操作是一项昂贵的操作。

在这种情况下最好执行 JOIN 并拉取所有数据,还是执行 SELECT with LIMIT 子句 N 次?

【问题讨论】:

  • Mysql 获取的数据不会超过生成结果集所需的数据。因此,如果可能的话 - 它只读取 LIMIT 行数
  • 另一方面,有些事情可能阻止 MySQL 提前终止——例如ORDER BY 可以强制首先实现整个 RS,因为 LIMIT 是“查看操作”。
  • @pst: 这不是很明显 - 因为ORDER BY 可能使用索引
  • @zerkms 好电话。我添加了难以捉摸的“可能”和“可以”。 SQL 数据库引擎非常智能。
  • 请参阅this 链接,了解 MySQL 如何根据联接旁边的其他内容优化查询。

标签: mysql sql join query-optimization limit


【解决方案1】:

不,限制功能只是视觉上的后期效果。

1/ JOINS 被计算。

2/ 处理 WHERE 过滤器和 HAVING 过滤器

3/ LIMIT 减少了返回结果的数量。如果您指定了任何 ORDER BY 子句,订单仍将保留。

改进您的联接以减少计算开销。

【讨论】:

  • 因为要减少开销,您必须减少行扫描。限制功能不会阻止扫描,因为解析器仍然必须计算所有内容才能知道它必须“限制”什么。使用 WHERE 子句减少开销。
  • “仍然必须计算所有内容才能知道它必须“限制”什么”——这是错误的。 mysql只要得到LIMIT N行就可以返回行
  • 不,不是,必须计算 where 连接才能知道要返回的行是什么。这是花费时间的地方。
  • LIMIT 1返回结果集mysql不应该加入整个十亿行表,它可以只加入每个表中的1行
  • @Sebas 除非有什么需要物化行以确保获取“正确的 N”(例如 ORDER BY),否则 SQL 没有理由(或要求)做更多的工作比获得 N 行(无论它们碰巧是哪 N 行)所必需的。当然,ORDER BY 最常用于任何查询,所以...
【解决方案2】:

短版:取决于查询

更长的版本:当你有一个 LIMIT 子句时,它假定你有以某种方式排序的数据。如果您没有明确指定 ORDER BY 子句,您将看到,只要 MySQL 找到所需的行数,查询的执行就会停止。如果您有一个需要文件排序的排序,所有数据将在一个临时表中排序,MySQL 将输出您指定的前 N ​​行。

但是如果你强制使用特定的连接顺序和索引,MySQL 会很高兴地缩短执行时间。

【讨论】:

  • 好的,这是有道理的,因为索引通常有某种顺序、自增、日期等。因此,如果我使用WHERE子句并且不强制mysql引擎进行排序,则可以进行内部优化
猜你喜欢
  • 2021-08-07
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 2010-09-19
相关资源
最近更新 更多