Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使此查询高效?_Mysql_Sql_Indexing_Query Optimization_Mariadb - Fatal编程技术网

Mysql 如何使此查询高效?

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

我有一个非常复杂的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.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
我想检索(以任何顺序):

  • 一,
  • 二,
  • 三,
  • 四,
  • 五,
  • 十五
  • 二十
我尝试了几个我认为有帮助的指标:(type,id1),(type,id2),(type,id1,id2);但是没有用。解释说它正在使用它们,但没有明显的区别

只要每个表有几千行,不包含列表部分的时间大约为一秒钟。对于一些(大的,上百个元素)列表,它似乎需要更多的时间

为什么要花这么多时间?有可能使它更快吗


我希望这没有多大关系,但我使用的是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列表,为什么你想要更多?你应该展示一些实际数据,以便更好地解释你想要实现的目标。谢谢。我希望找到一些明显的我做错了的事情。我没有想过使用联合,我想这可能会有所帮助。查询比提供的示例复杂得多,因此更改比我预期的要困难得多,但使用联合,运行速度要快一个数量级(无论如何,使用我当前的数据)。它还帮助我发现了一个讨厌的虫子。