我有两张桌子
Parent:
+--+---------+
|id| text |
+--+---------+
| 1| Blah |
| 2| Blah2 |
| 3| Blah3 |
+--+---------+
Children
+--+---------+---------+
|id|parent_id| table_id|
+--+---------+---------+
| 1| 1 | 1 |
| 2| 1 | 3 |
| 3| 2 | 2 |
+--+---------+---------+
我想找到父母有一个table_id为1和3的孩子。 目前我正在使用以下查询
SELECT *
FROM Parent
WHERE id
IN (
SELECT parent_id
FROM Children
WHERE table_id = 1
)
AND id
IN (
SELECT parent_id
FROM Children
WHERE table_id = 3
)
由于我有数千条记录,因此查询运行速度非常慢。
是否有更快的查询来执行它?
答案 0 :(得分:1)
您可以让mysql EXPLAIN 执行您的计划:查看手册中的this chapter。从那里,您可以优化查询的速度。有不同的方法,它是一个广泛的领域 - 但总的来说,它是一个很好的开始,以最小化包含的连接和内部查询的数量和宽度。
答案 1 :(得分:0)
有很多方法可以做到这一点,而正确索引的一种方法可以使它快速成为
select p.* from parent p
join children c on c.parent_id = p.id
where c.table_id = 1
and exists (
select 1 from children c1
where c1.parent_id = c.parent_id
and c1.table_id = 3
);
可以添加为
的索引alter table parent add index id_idx(id);
alter table children add index parent_idx(parent_id);
alter table children add index table_id_idx(table_id);
答案 2 :(得分:-1)
SELECT c.parent_id, p.text,
SUM(CASE WHEN c.table_id=1 THEN 1 ELSE 0 END) as t_1,
SUM(CASE WHEN c.table_id=3 THEN 1 ELSE 0 END) as t_3
FROM Children c
LEFT JOIN Parent p
ON c.parent_id = p.id
WHERE c.table_id IN ( 1, 3)
GROUP BY c.parent_id
HAVING t_1>0 AND t_3>0