当内部查询 returns 没有结果时,外部查询非常慢
Outer query is very slow when inner query returns no results
我正在尝试从名为 export
的 table 中获取具有随机权重的行。然后它应该从引用第一行的另一个 table export_chunk
中获取一行。这是查询:
SELECT * FROM export_chunk
WHERE export_id=(
SELECT id FROM export
WHERE schedulable=1
ORDER BY -LOG(1 - RAND())/export.weight LIMIT 1)
AND status='PENDING'
LIMIT 2;
export
table 可以有 1000 行,而 export_chunk table 可以有数百万行。
内部查询return一行时,查询速度非常快。但是,如果没有包含 schedulable=1
的行,则外部查询会对 export_chunk
执行完整的 table 扫描。为什么会发生这种情况,有什么办法可以预防吗?
编辑:尝试 COALESCE()
Akina在评论中建议使用COALESCE,即:
SELECT * FROM export_chunk
WHERE export_id=COALESCE(
SELECT id FROM export
WHERE schedulable=1
ORDER BY -LOG(1 - RAND())/export.weight LIMIT 1)
,-1)
AND status='PENDING'
LIMIT 2;
这应该有效。当我 运行:
SELECT COALESCE((SELECT id FROM export WHERE schedulable=1 ORDER BY -LOG(1-RAND())/export.weight LIMIT 1), -1) FROM export;
它对 Akina 预测的每一行执行 return -1。如果我手动搜索 -1 而不是内部查询,它 return 很快就没有行。但是,当我尝试在内部查询上使用 COALESCE 时,它仍然非常慢。我不明白为什么。
测试一下:
SELECT export_chunk.*
FROM export_chunk
JOIN ( SELECT id
FROM export
WHERE schedulable=1
ORDER BY -LOG(1 - RAND())/export.weight
LIMIT 1 ) AS random_row ON export_chunk.export_id=random_row.id
WHERE export_chunk.status='PENDING'
LIMIT 2;
这符合需要的逻辑吗?特别是当子查询中没有匹配的行时 - 你需要 none 输出行(像现在一样)还是在这种情况下的任何 2 行?
PS。外部查询中没有 ORDER BY 的 LIMIT 很奇怪。
我正在尝试从名为 export
的 table 中获取具有随机权重的行。然后它应该从引用第一行的另一个 table export_chunk
中获取一行。这是查询:
SELECT * FROM export_chunk
WHERE export_id=(
SELECT id FROM export
WHERE schedulable=1
ORDER BY -LOG(1 - RAND())/export.weight LIMIT 1)
AND status='PENDING'
LIMIT 2;
export
table 可以有 1000 行,而 export_chunk table 可以有数百万行。
内部查询return一行时,查询速度非常快。但是,如果没有包含 schedulable=1
的行,则外部查询会对 export_chunk
执行完整的 table 扫描。为什么会发生这种情况,有什么办法可以预防吗?
编辑:尝试 COALESCE()
Akina在评论中建议使用COALESCE,即:
SELECT * FROM export_chunk
WHERE export_id=COALESCE(
SELECT id FROM export
WHERE schedulable=1
ORDER BY -LOG(1 - RAND())/export.weight LIMIT 1)
,-1)
AND status='PENDING'
LIMIT 2;
这应该有效。当我 运行:
SELECT COALESCE((SELECT id FROM export WHERE schedulable=1 ORDER BY -LOG(1-RAND())/export.weight LIMIT 1), -1) FROM export;
它对 Akina 预测的每一行执行 return -1。如果我手动搜索 -1 而不是内部查询,它 return 很快就没有行。但是,当我尝试在内部查询上使用 COALESCE 时,它仍然非常慢。我不明白为什么。
测试一下:
SELECT export_chunk.*
FROM export_chunk
JOIN ( SELECT id
FROM export
WHERE schedulable=1
ORDER BY -LOG(1 - RAND())/export.weight
LIMIT 1 ) AS random_row ON export_chunk.export_id=random_row.id
WHERE export_chunk.status='PENDING'
LIMIT 2;
这符合需要的逻辑吗?特别是当子查询中没有匹配的行时 - 你需要 none 输出行(像现在一样)还是在这种情况下的任何 2 行?
PS。外部查询中没有 ORDER BY 的 LIMIT 很奇怪。