当内部查询 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 很奇怪。