【问题标题】:Join performance: Oracle vs MySQL加入性能:Oracle vs MySQL
【发布时间】:2012-06-12 18:23:57
【问题描述】:

给定一个简化为以下形式的查询:

select b.field1
from table_a a
    inner join table_b b on b.field1 = a.field1
    left join table_c c on c.field1 = a.field1
    left join table_d d on d.field1 = b.field1
    left join table_e e on e.field1 = b.field6
group by b.field1,
         b.field2,
         b.field3,
         b.field4,
         b.field5,

         e.field2,
         e.field3
;

对于一定数量的数据,它在 Oracle 中运行时间为 20 秒。 Oracle 中没有任何索引。 迁移到 MySQL 中的查询不想完成(在几分钟内执行)。有问题的每个字段都在 MySQL 中建立索引。 Explain 表示一切正常。

仍然无法工作后,分组字段获得了多列索引。还是什么都没有。

MySQL 性能仍然存在巨大泄漏可能是什么问题?有什么方法可以加快速度吗?

【问题讨论】:

  • 您能否确认两个测试中的基础架构相同?
  • 是的,是一样的。另外,我将该字段放在选择中,否则它会在 Oracle (Pl/SQL) 中引发错误。只是想尽可能地减少查询。
  • 我的朋友,并不是所有的性能都与索引有关,还包括引擎、缓存、缓冲区等......
  • 加载后你分析过你的表吗?
  • 分析和加载是什么意思?

标签: mysql sql performance oracle


【解决方案1】:

Oracle 能够进行哈希连接和合并连接,MySQL 不能。

由于您的表没有以任何方式过滤,因此哈希连接将是进行连接的最有效方式,尤其是在您没有任何索引的情况下。

使用嵌套循环,即使所有连接字段都被索引,MySQL 需要在循环中从前导表中对每个值进行索引查找(每次从根索引页开始),然后进行表查找检索记录,然后为每个连接的表重复它。这涉及大量随机搜索。

另一方面,哈希连接需要扫描一次较小的表(构建哈希表),然后扫描一次较大的表(搜索构建的哈希表)。这涉及速度更快的顺序扫描。

此外,对于嵌套循环,左连接表只能被驱动(在内部循环中扫描),而对于任何一侧的散列连接表都可以是前导(扫描)或驱动(哈希然后搜索)。这也会影响性能。

MySQL 的优化器虽然支持一些其他引擎缺乏的便捷技巧,但与其他引擎相比功能非常有限,目前既不支持散列连接也不支持合并连接。因此,这样的查询在 MySQL 上很可能会很慢,即使它在相同数据上的其他引擎上速度很快。

【讨论】:

  • 有没有办法用 MySQL 来实现?
  • @user1433877:实现什么,哈希连接?没有。
  • +1 但是除了哈希表之外还有其他方法可以解决吗?
  • @user1433877:MySQL 只支持嵌套循环。有很多事情在 MySQL 中无法有效实现,您的查询就是其中之一
  • @user1433877:试试 PostgreSQL,它可以处理这样的查询,它确实有哈希连接和合并连接。当您熟悉 Oracle 后,您会很快对 PostgreSQL 感到满意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2016-03-16
  • 1970-01-01
  • 2021-11-03
相关资源
最近更新 更多