如果给定的主ID值为0,则MySQL查询在LEFT JOIN中的运行速度会非常慢

问题描述

| 在此sql中:
    SELECT s.*,u.id,u.name 
      FROM shops s 
 LEFT JOIN users u ON u.id = s.user_id 
                   OR u.id = s.owner_user_id 
     WHERE s.status = 1
由于某种原因,此查询需要花费大量时间。尽管id是主键。尤其是在我添加了部分“ 1”之后,查询变得很慢。
owner_user_id
常常只有0次。但是,为什么显然要花这么长时间扫描整个表呢?数据库表“ 3”非常长且很大。我没有设计。这是给后来的程序员添加太多字段的客户使用的。该表是22k行和数十个字段。 *仅用于演示的字段名称。实际名称是不同的,所以不要问我为什么我要寻找owner_user_id(;我确实通过删除\“ OR ... \”部分并在循环中搜索id(如果有的话)来解决速度过慢的问题不是0。但是我想知道为什么会这样,以及如何按原样加快查询速度。     

解决方法

您可以使用
IN
代替
OR
加快速度,但这是次要的。
SELECT u.id,u.name 
      FROM shops s
 LEFT JOIN users u ON u.id IN ( s.user_id,s.owner_user_id )
WHERE s.status = 1
首先,此表上有索引吗?主要是在user.id字段还是s.user_id或s.owner_user_id上? 但是,我必须问为什么您需要使用LEFT JOIN而不是常规联接。 LEFT JOIN使每一行彼此匹配。并且由于我假设值/ id应该在user_id或owner_user_id字段中,并且始终存在匹配项,如果是这种情况,则使用JOIN可以加快查询速度。 正如Mitch所说,22k行很小。     ,您将如何知道哪个用户记录是哪个?这是我的做法
SELECT s.*,u.name AS user_name,o.name AS owner_name
FROM shops s
LEFT JOIN users u ON s.user_id = u.id
LEFT JOIN users o ON s.owner_user_id = o.id
WHERE s.status = 1
我在user8ѭ的用户表中省略了这些ID,因为这些ID还是ѭ9的一部分。 我也对左联接感到好奇。如果ѭ10和ѭ11是必需的外键,请改用内部联接。