首页 > 解决方案 > 在左连接表上使用 WHERE OR 时查询很慢?

问题描述

我有表user关系 OneToMany 到 tableA和 table BA我需要在桌子和桌子上找到其合作伙伴 = 275 的用户B

我的查询是:

SELECT     u.id 
 FROM      user u 
 LEFT JOIN A a 
 ON        a.user_id = u.id
 LEFT JOIN B b 
 ON        b.user_id = u.id
 WHERE     a.partner_id = 275 
 OR        b.partner_id = 275
 GROUP BY  u.id 
 ORDER BY  u.id DESC 
 LIMIT     20

尽管我在表上创建索引,但查询速度很慢。这里解释一下:

id : 1
select_type: SIMPLE
table: u
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 20
Extra: Using index

我试图删除“或”侧,例如:

SELECT u.id FROM user u 
LEFT JOIN A a ON a.user_id = u.id
LEFT JOIN B b ON b.user_id = u.id
WHERE a.partner_id = 275
GROUP BY u.id ORDER BY u.id DESC LIMIT 20

或者

SELECT u.id FROM user u 
LEFT JOIN A a ON a.user_id = u.id
LEFT JOIN B b ON b.user_id = u.id
WHERE b.partner_id = 275
GROUP BY u.id ORDER BY u.id DESC LIMIT 20

两个查询都很快。我不知道为什么?

标签: mysqlsqlsubqueryleft-joinquery-optimization

解决方案


我想要用户 ida或者b有 275 的合作伙伴,你可以使用:

SELECT a.user_id
FROM A a
WHERE a.partner_id = 275
UNION 
SELECT b.user_id
FROM B b
WHERE b.partner_id = 275;
ORDER BY user_id DESC
LIMIT 20;

然后对于此查询,您需要索引A(partner_id, user_id)B(partner_id, user_id)


推荐阅读