mysql - 提高一对多连接的性能
问题描述
我们正在构建一个模型,其中我们将 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
)
解决方案
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`)
(同时,我不明白你在第一段中所说的任何内容的相关性。)
推荐阅读
- c++ - 我的应用程序是从 Visual Studio 内部运行还是通过执行 EXE 文件运行
- android - 如何在通知 Onclick android 上进行特定活动?默认它转到启动器活动/ MainActivity。这个怎么做?
- gtk2 - 如何在 NixOS 上安装 libgtk2.0-dev?
- r - 如何计算R中数据集中排列的发生?
- javascript - 如何在 php 和 html 中强制下载 googlevideo.com 链接
- php - 删除“?” 仅在 str_replace 的特定子目录中
- javascript - 如何创建卫星轨道并使用 SGP4 模型对其进行动画处理?
- dart - Flutter:如何在手势检测器中禁用 onTap 一段时间?
- php - 如何在 PHP 的 foreach 循环中获取两个项目?
- java - 从标签流中查找任意时间点的前 k 个标签