我们正在建立一个模型,我们将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
)
答案 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_ID
和01_01_resource_utilization_prepared.RESOURCE_PROFILE_ID
声明为外键,并将其编入索引。这将使基本连接更快,并提供参照完整性。
03_01_schedule.DATE
,01_01_resource_utilization_prepared.EFFECTIVE_FROM
和01_01_resource_utilization_prepared.EFFECTIVE_TO
都应编入索引。这样可以更快地比较这些列。