【问题标题】:MySQL resources utilisation optimisationMySQL资源利用优化
【发布时间】:2013-04-15 10:33:02
【问题描述】:

有2个查询:

select * from X inner join Y on X.id=Y.id where X.text = "ABC";

select * from X inner join Y on X.id=Y.id and X.text = "ABC";

在执行期间内存利用率是否有足够的差异,哪一个不那么贪婪?请证明你的答案。

【问题讨论】:

  • 此查询很简单,两者都将返回相同的结果,但请注意,在更复杂的查询中将条件从 where 子句移动到 join 子句可能会改变查询的结果及其运行方式。

标签: mysql select query-optimization


【解决方案1】:

在这样的简单选择中,查询优化器应该将两个查询优化为相同的代码。

哪个查询更贪婪取决于您的索引。

如果 Y.id 上有索引但 X.text 上没有索引,机器人查询将执行相同的操作。

如果 Y.id 上没有索引并且 X.text 上没有索引,那么你必须走运。如果 MySQL 正确优化,第一个查询可能会更快,因为它在连接之前应用 where(这将是一个嵌套循环连接)。

如果在 Y.id 和 X.text 上有和索引,第一个查询会更快,因为它可以利用这两个索引。它将首先应用 where 子句,然后进行索引连接。

基本规则:不要在 JOIN 子句的前导表 (X) 上应用 where 条件。请务必在连接子句中包含连接表 (Y) 的 where 条件(尤其是在进行左连接时)。

【讨论】:

  • 您写了“查询优化器应该将两个查询优化到相同的代码”,我怀疑您是对的,但是要 100% 确定。你能给我一个文档等的链接来证明这一点吗?
  • 我写的是应该的,因为这是查询优化器通常所做的(不是我认为它应该做的)。不幸的是,查询优化器并不总是做出正确的决定(它取决于可能导致错误决定的统计信息)。我没有到文档的链接,我知道这一点,因为我在 MySQL 上运行了一个数据仓库并进行了很多查询调整,而且我与 Oracle 的 MySQL 专业人员进行了很多交谈。 MySQL 中的很多内容都是反复试验。编写查询,运行 EXPLAIN,优化,运行,以不同的方式编写,比较。
  • 我认为查询优化器不会为这两个查询创建相同的查询计划,因为它们的功能不同。尽管它们对人类来说是一样的,但它们的功能不同,我认为查询优化器不会使它们相同。我建议创建一个包含大量数据的表并测试查询以获得答案。
  • 这就是我添加关于索引和表大小的免责声明的原因。如果每个表中只有几行并且没有索引,MySQL 将识别它必须对两个表执行完整的表并首先连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2010-09-13
  • 1970-01-01
  • 2018-08-17
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多