如何使这个查询高效?
How to make this query efficient?
我有一个非常复杂的 SQL 查询,多亏了 index.但是,有一个 JOIN 我似乎无法使速度更快。
简化很多,可能是这样的:
Table main: id INT;
Table 参考:类型 INT、id1 INT、id2 INT;
换句话说,有一个主 table 有一个 id 字段,另一个 table 有两个字段 id1 和 id2。
对于我感兴趣的某些类型值(比如 t1 和 t2),id1 和 id2 都是对主要 table.
的引用
查询;
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,我想要相关的一个。
一个例子。具有以下数据:
main:
- 1..20
ref:
(1, 15)
(20, 2)
(3, 5)
(12, 17)
LIST:
- 1..5
我想检索(以任何顺序):
- 1
- 2
- 3
- 4
- 5
- 15
- 20
我尝试了几个我认为有帮助的索引:(type, id1), (type, id2), (type, id1, id2);但无济于事。 EXPLAIN 说它正在使用它们,但没有明显的区别。
只要每个 table 有几千行,如果没有列表部分,它就需要一秒钟的时间。对于一些(大的,数百个元素)列表,它似乎需要更多。
为什么要花这么多时间?有可能让它更快吗?
我希望这没什么大不了的,但我使用的是 MariaDb 10.0.16
如果不了解您的系统的很多细节,就很难给出性能建议。不过,这是另一种方法,它可能会或可能不会表现得更好:
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)
我有一个非常复杂的 SQL 查询,多亏了 index.但是,有一个 JOIN 我似乎无法使速度更快。
简化很多,可能是这样的:
Table main: id INT; Table 参考:类型 INT、id1 INT、id2 INT;
换句话说,有一个主 table 有一个 id 字段,另一个 table 有两个字段 id1 和 id2。 对于我感兴趣的某些类型值(比如 t1 和 t2),id1 和 id2 都是对主要 table.
的引用查询;
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,我想要相关的一个。
一个例子。具有以下数据:
main:
- 1..20
ref:
(1, 15)
(20, 2)
(3, 5)
(12, 17)
LIST:
- 1..5
我想检索(以任何顺序):
- 1
- 2
- 3
- 4
- 5
- 15
- 20
我尝试了几个我认为有帮助的索引:(type, id1), (type, id2), (type, id1, id2);但无济于事。 EXPLAIN 说它正在使用它们,但没有明显的区别。
只要每个 table 有几千行,如果没有列表部分,它就需要一秒钟的时间。对于一些(大的,数百个元素)列表,它似乎需要更多。
为什么要花这么多时间?有可能让它更快吗?
我希望这没什么大不了的,但我使用的是 MariaDb 10.0.16
如果不了解您的系统的很多细节,就很难给出性能建议。不过,这是另一种方法,它可能会或可能不会表现得更好:
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)