选择不包含其他表的引用的记录

时间:2018-05-31 15:57:50

标签: mysql database-design mariadb database-optimization

无法正确描述标题中的问题,抱歉。 让我们说,我有两个表A(id,其他列)和B(id,a_id,其他列),其中a_id - A表的外键。 A有大约10 000条记录,B大约有百万条。我需要从A中选择随机记录,这在表B中没有关系。可以这样做:

SELECT * FROM (SELECT A.id, B.id as b_id FROM A LEFT JOIN B ON B.a_id = A.id ORDER BY RAND()) tmp WHERE b_id IS NULL LIMIT 1;

但是,子查询在应用where和limit之前执行完全执行,因此生成的查询将执行不可接受的时间。 我想知道,如果不使用子查询,是否有更聪明的方法来做同样的事情。

P.S。这部分解决了滥用~90%的子查询实际上在B中没有匹配这一事实,所以我首先运行此查询:

SELECT * FROM (SELECT A.id, B.id as b_id FROM A LEFT JOIN B ON B.a_id = A.id ORDER BY RAND() LIMIT 10) tmp WHERE b_id IS NULL LIMIT 1;

只有在没有命中的情况下我才能运行第一个。它有效,但看起来非常糟糕。

1 个答案:

答案 0 :(得分:1)

在大数据集中,您可以使用exists:

SELECT *
FROM A
WHERE NOT EXISTS (
SELECT *
FROM B
WHERE A.id = B.a_id
)
相关问题