2

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

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性能仍然存在巨大泄漏可能是什么问题?有没有加快速度的方法?

4

1 回答 1

8

Oracle能够进行散列连接和合并连接,MySQL不是。

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

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

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

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

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

于 2012-06-08T17:50:51.213 回答