我有一个非常复杂的SQL查询,由于索引,它大部分都运行良好。但是,有一个JOIN,我似乎无法加快速度。
简化很多,可能如下所示:
表格主要:id INT; 表ref:类型INT,id1 INT,id2 INT;
换句话说,有一个带有id字段的主表,另一个带有两个字段id1和id2的表。 对于我感兴趣的某些类型的值(比如t1和t2),id1和id2都是对主表的引用。
查询;
SELECT main.id
, ref.id2 FROM main
LEFT
JOIN ref
ON ref.type = t1
OR ref.type = t2
AND (main.id = ref.id1 OR main.id = ref.id2)
WHERE main.id IN (list)
OR main.id = ref.id1
OR main.id = ref.id2
用自然语言: 我有一个ID列表。我想要所有这些ID,对于该列表中的每个id1或id2,我想要相关的。
一个例子。使用以下数据:
主:
- 1..20
参考:
(1,15)
(20,2)
(3,5)
(12,17)
列表:
- 1..5
我想检索(以任何顺序):
我尝试了几个我认为可以帮助的索引:( type,id1),(type,id2),(type,id1,id2);但无济于事。 EXPLAIN说它正在使用它们,但没有明显的区别。
一旦每个表有几千行,它就会在没有列表部分的情况下大约一秒钟。对于一些(大的,数百个元素)列表,它似乎需要更多。
为什么需要这么多时间?是否可以加快速度?
我希望它没关系,但我正在使用MariaDb 10.0.16
答案 0 :(得分:0)
如果不了解有关系统的大量细节,很难提供性能建议。这是一种替代方法,可能会或可能不会更好:
SELECT id FROM main WHERE id IN (1, 2, 3, 4, 5)
UNION
SELECT id2 FROM refs WHERE id1 IN (1, 2, 3, 4, 5)
UNION
SELECT id1 FROM refs WHERE id2 IN (1, 2, 3, 4, 5)