mysql - 加入性能 : Oracle vs MySQL

标签 mysql sql performance oracle

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

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 能够执行散列连接和合并连接,MySQL 不能。

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

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

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

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

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

关于mysql - 加入性能 : Oracle vs MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10953143/

相关文章:

mysql - 数据库缺失错误

php - 如何使自动化任务比简单的 CRON 作业更高级?

php - 执行此子查询的更好方法

SQL:如何最好地查询历史表以创建特定日期的快照概述

mysql - 从先前的记录中选择并使用两个主要 ORDER BY

sql - 带有 CASE 语句的特殊 ORDER BY - 需要指导

SQL 原子增量和锁定策略 - 这安全吗?

java - 随着写入操作数量的增加,文件写入速度急剧下降

python - 集合中的快速随机元素 - Python

postgresql - 多边形搜索中的点太慢