Mysql 如何使此查询高效?
我有一个非常复杂的SQL查询,由于索引的缘故,它运行得很好。然而,有一个加入我似乎不能更快 简化很多,它可以是如下所示: 表main:id INT; 表ref:类型INT、id1 INT、id2 INT 换句话说,一个主表有一个id字段,另一个表有两个字段id1和id2。 对于我感兴趣的某些类型的值(比如t1和t2),id1和id2都是对主表的引用 查询Mysql 如何使此查询高效?,mysql,sql,indexing,query-optimization,mariadb,Mysql,Sql,Indexing,Query Optimization,Mariadb,我有一个非常复杂的SQL查询,由于索引的缘故,它运行得很好。然而,有一个加入我似乎不能更快 简化很多,它可以是如下所示: 表main: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.typ
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,我想要相关的ID
举个例子。使用以下数据:
主要内容:
- 1..20
- (1、15)
- (20,2)
- (3,5)
- (12、17)
- 1..5
- 一,
- 二,
- 三,
- 四,
- 五,
- 十五
- 二十
我希望这没有多大关系,但我使用的是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)
你必须
WHERE
子句,但是子句上没有。或-ed连接条件通常会导致糟糕的计划,最好重写为两个Selecta加UNION
。t1
和t2
列或参数是什么?我不理解外部查询中的或子句。如果你有一个你感兴趣的ID列表,为什么你想要更多?你应该展示一些实际数据,以便更好地解释你想要实现的目标。谢谢。我希望找到一些明显的我做错了的事情。我没有想过使用联合,我想这可能会有所帮助。查询比提供的示例复杂得多,因此更改比我预期的要困难得多,但使用联合,运行速度要快一个数量级(无论如何,使用我当前的数据)。它还帮助我发现了一个讨厌的虫子。