加入性能:Oracle vs MySQL

use*_*877 1 mysql sql oracle performance

鉴于查询简化为以下形式:

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
;
Run Code Online (Sandbox Code Playgroud)

使用一定数量的数据,它在Oracle中运行20秒.Oracle中没有任何索引编入索引.迁移到MySQL后,查询不想完成(在几分钟内执行).有问题的每个字段都在MySQL中编入索引.Explain告诉一切都很好.

仍然无法工作后,分组字段获得多列索引.依然没有.

MySQL性能仍然存在巨大漏洞的问题是什么?有没有办法加快速度?

Qua*_*noi 8

Oracle能够做散列连接和合并连接,MySQL不是.

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

使用嵌套循环,即使所有连接字段都已编制索引,也MySQL需要对循环中的前导表中的每个值执行索引查找(每次从根索引页开始),然后执行表查找以检索记录,然后为每个连接的表重复它.这涉及许多随机搜寻.

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

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

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