提高一对多联接的效果

时间:2018-06-07 22:00:00

标签: mysql performance

我们正在建立一个模型,我们将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
)

2 个答案:

答案 0 :(得分:1)

01_01是否参考Jan 01?如果是这样,我认为这是一种布置数据的不好方法。但同时......

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

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

需要LEFT吗?如果可以在不破坏语义的情况下删除它,那么一个更好的选择可以自行使用。删除LEFT会使其在a上有用:

INDEX(RESOURCE_PROFILE_ID, `DATE`)

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

答案 1 :(得分:0)

如果没有更多信息,我无法准确说出,但效果取决于indexing您要比较的列。如果没有索引,连接可能必须扫描每一行"full table scan"

在MySQL中忘记declare foreign keys很常见。应将03_01_schedule.RESOURCE_PROFILE_ID01_01_resource_utilization_prepared.RESOURCE_PROFILE_ID声明为外键,并将其编入索引。这将使基本连接更快,并提供参照完整性。

03_01_schedule.DATE01_01_resource_utilization_prepared.EFFECTIVE_FROM01_01_resource_utilization_prepared.EFFECTIVE_TO都应编入索引。这样可以更快地比较这些列。