【问题标题】:MySQL efficient way to select rows from table 1 where join does not existMySQL从表1中选择不存在连接的行的有效方法
【发布时间】: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 的表定义?特别是包括指数。

标签: php mysql


【解决方案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 当然是外键。

    【讨论】:

      猜你喜欢
      • 2012-06-10
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多