MySQL从表1中选择不存在连接的行的有效方法

Posted

技术标签:

【中文标题】MySQL从表1中选择不存在连接的行的有效方法【英文标题】:MySQL efficient way to select rows from table 1 where join does not exist 【发布时间】:2015-10-19 13:09:25 【问题描述】:

我已经为此尝试了很多答案,但没有一个对我有用。

Find records where join doesn't exist

Select * from table1 that does not exist in table2 with conditional

我有 2 张桌子。 1 是一个包含大约 50,000 个项目的项目表。第二个是超过 100,000 行的评级表。我想获得所有没有投票的项目。

我尝试了以下方法,它似乎是有效的,但它似乎冻结了,可能是因为它必须检查这么多记录。我有没有更有效的方法来实现这一点。

SELECT title FROM items LEFT JOIN itemvotes ON items.id = itemvotes.itemid WHERE itemvotes.vote 为空

我确信这个查询最终会返回结果,但我需要这是一个快速的东西,可以从一个 php 网页检查,所以它需要在几秒钟内加载。

只是为了确认。上面的查询花了 3 多分钟才返回结果。它是有效的,但是太慢了。

【问题讨论】:

您能否提供itemsitemvotes 的表定义?特别是包括指数。 【参考方案1】:

子查询可能会更快:

SELECT title FROM items
WHERE id NOT IN (
    SELECT itemid
    FROM itemvotes 
)

当您进行外连接时,它首先连接然后搜索,因此它搜索 50,000 * 100,000 行。如果您进行子查询,则它最多查看 50,000 + 100,000。当然,您还必须确保在两个表上都有正确的索引。

【讨论】:

【参考方案2】:

为什么不使用类似的东西:

 SELECT * FROM `table1` WHERE `id` NOT IN SELECT `table1_id` FROM `table2`

table1_id 当然是外键。

【讨论】:

以上是关于MySQL从表1中选择不存在连接的行的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

用于从表中选择具有最新时间戳的行的 JOOQ 代码

从表中选择不同的记录并执行重复行的列总和(托盘、总和)。并显示重复的行一次[关闭]

检查表中是不是存在行的最有效方法是啥?

SQL:从表 1 中选择行并存在(表 2 中的行)

DELETE - 删除一个表中的行

MySQL学习笔记11复制错误处理删除不存在的行的问题