首页 > 解决方案 > 提高一对多连接的性能

问题描述

我们正在构建一个模型,其中我们将 13 部分配置文件 ( 01_01_resource_utilization_prepared) 加入到每日记录中,以每天创建 13 条记录;这是一个故意的一对多,它会增加表格的大小。

这是一个简单的查询,但我们已经尝试过索引,但优化此查询的最佳方法是什么?

SELECT
a.DATE,
a.RUN_ID,
a.HOURS,
a.HOURS * b.RESOURCE_DISTRIBUTION,
a.SCHEDULE_PROFILE_ID,
a.WEEKDAY_NUMBER,
a.SCHEDULE_DISTRIBUTION,
b.RESOURCE_DISTRIBUTION,
a.LOCATION_DESC,
a.DEPARTMENT_DESC,
a.LANGUAGE_DESC,
a.JOB_TITLE_DESC,

FROM
03_01_schedule a
LEFT JOIN 01_01_resource_utilization_prepared b ON (
    a.RESOURCE_PROFILE_ID = b.RESOURCE_PROFILE_ID
    AND a.DATE >= b.EFFECTIVE_FROM
    AND a.DATE <= b.EFFECTIVE_TO
)

标签: mysqlperformance

解决方案


01_01是指1月01日吗?如果是这样,我建议这是布置数据的不好方法。但与此同时...

在一个范围内检查,该范围来自另一个表很难优化。这些复合索引b会有所帮助:

INDEX(RESOURCE_PROFILE_ID, EFFECTIVE_FROM)
INDEX(RESOURCE_PROFILE_ID, EFFECTIVE_TO)

LEFT需要吗?如果它可以在不破坏语义的情况下被删除,那么一个更好的选择就会发挥作用。删除LEFT将使这在以下方面有用a

INDEX(RESOURCE_PROFILE_ID, `DATE`)

(同时,我不明白你在第一段中所说的任何内容的相关性。)


推荐阅读