我正在尝试运行此查询。这很慢。 30秒后我仍然没有结果。
我在step,source,video_id上有索引。
第1步是视频上传
第4步是视频可供下载
源5是视频类型
在encoding_history表中,我有很多次相同的video_id,包含不同的处理步骤(上传,编码......)
我的需求是在6个多小时前上传所有视频,但仍未准备下载。
如果删除子查询,则速度非常快。
我的表有大约6.000.000个条目。
$query = 'SELECT video_id FROM encoding_history WHERE
video_id NOT IN (SELECT video_id FROM encoding_history WHERE step = 4 AND source = 5 GROUP BY video_id)
AND step = 1
AND source = 5
AND date_added > DATE_SUB(NOW(), INTERVAL 6 HOUR)';
有关如何加快结果的任何想法?感谢。
答案 0 :(得分:1)
执行计划将有所帮助,因为您可能缺少有用的索引,但我认为这样可以更快地运行。
SELECT Eh1.video_id
FROM encoding_history EH1
LEFT JOIN Encoding_history EH2
on EH2.step=4 and EH2.source=5
and EH1.step=1 and EH1.source=5
AND EH1.date_added > DATE_SUB(NOW(), INTERVAL 6 HOUR)
WHERE Eh2.Video_ID is null
结果: 返回步骤1中源为5的所有Video_IDS 没有第4步的来源5。 这是在过去6小时内添加的。
答案 1 :(得分:0)
视频在步骤1和步骤4中无法同时进行,因此只需删除子查询
另一个问题(感谢xQbert)您可以将此操作移动到您的应用程序而不是数据库。