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 多分钟才返回结果。它是有效的,但是太慢了。
【问题讨论】:
您能否提供items
和itemvotes
的表定义?特别是包括指数。
【参考方案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中选择不存在连接的行的有效方法的主要内容,如果未能解决你的问题,请参考以下文章