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

标签 mysql database-design mariadb database-optimization

抱歉,无法正确描述标题中的问题。 比方说,我有两个表 A(id,其他列)和 B(id,a_id,其他列),其中 a_id - A 表的外键。 A 有大约 10 000 条记录,B 大约有 10 000 条记录。我需要从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 之前完全执行,因此生成的查询执行时间 Not Acceptable 。 我想知道是否有一种更智能的方法可以在不使用子查询的情况下执行相同的操作。

附注这部分解决了滥用约 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;

只有当它没有点击时我才会运行第一个。它有效,但看起来很糟糕。

最佳答案

在大数据集中你可以使用存在:

SELECT *
FROM A
WHERE NOT EXISTS (
SELECT *
FROM B
WHERE A.id = B.a_id
)

关于mysql - 选择不包含其他表引用的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50628370/

相关文章:

oracle - 得到一个名为保留字的Oracle表,可能会出现哪些问题?

mysql - 无法将具有空值的制表符分隔数据导入 mysql 表

mysql - 使用触发器更新同一服务器上另一个数据库的表

mysql - VB.NET:从 MySQL DB 检索图像(blob)

mysql - SQL查询: join

python - Python 和 Google SQL Cloud 之间的接口(interface)问题

mysql - 无法创建表 `sakila` .`address` "Foreign key constraint is incorrectly formed"

mysql - 如何从故障时间中提取中断时间

php - 横幅印象跟踪 - 数据库设计

mysql - 数据库设计(MySQL)-独立和链式商店