mysql - 在左连接表上使用 WHERE OR 时查询很慢?
问题描述
我有表user
关系 OneToMany 到 tableA
和 table B
。A
我需要在桌子和桌子上找到其合作伙伴 = 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
两个查询都很快。我不知道为什么?
解决方案
我想要用户 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)
。
推荐阅读
- sql - Oracle SQL:连接 - 缺少表达式
- java - 如何使用弹出窗口中的按钮从 recyclerview 项目中复制文本?
- c - makefile 无法创建 .o 文件
- unity3d - 我如何在 unity 2018.1 中设置和使用 proGrids?
- python - Django 在保存之前加密 FileField
- javascript - 从Javascript中的字符串中删除子字符串
- nest-device-access - 列出设备和结构为空
- data-structures - 如何断言/内省嵌套的递归结构/枚举?
- php - 不在 Nginx 服务器上加载 css 文件
- android - MutableMap/HashMap 的快捷方式