对Union mysql的多次复杂查询-优化器

对Union mysql的多次复杂查询-优化器,mysql,optimization,subquery,union,Mysql,Optimization,Subquery,Union,我想在UNION中多次使用同一子查询。这个子查询消耗时间,我认为使用它很多次可能会增加执行的总时间 比如说 (SELECT * FROM (SELECT * FROM A INNER JOIN B ... AND SOME COMPLEX WHERE CONDITIONS) as T ORDER BY column1 DESC LIMIT 10) UNION (SELECT * FROM (SELECT * FROM A INNER JOIN B ... AND SOME COMPLEX WHE

我想在UNION中多次使用同一子查询。这个子查询消耗时间,我认为使用它很多次可能会增加执行的总时间

比如说

(SELECT * FROM (SELECT * FROM A INNER JOIN B ... AND SOME COMPLEX WHERE CONDITIONS) as T ORDER BY column1 DESC LIMIT 10)
UNION
(SELECT * FROM (SELECT * FROM A INNER JOIN B ... AND SOME COMPLEX WHERE CONDITIONS) as T ORDER BY column2 DESC LIMIT 10)
UNION
(SELECT * FROM (SELECT * FROM A INNER JOIN B ... AND SOME COMPLEX WHERE CONDITIONS) as T ORDER BY column3 DESC LIMIT 10)
是否从内部联接B中选择*。。。一些复杂的条件执行了3次

如果mysql足够聪明,内部子查询将只执行一个,因此我不需要任何优化,但如果不需要,我必须使用其他方法来优化它,如使用临时表,但我希望避免它

我必须用其他语法优化这个查询吗?有什么建议吗

实际上,我想从大量记录中筛选一些数据,并将其中一些数据分为3组,每个组按不同顺序排列

临时表不能被多次引用。因此,构建一个永久表,完成后将其丢弃。如果您可能有多个连接在做相同的事情,那么确保您没有使用相同的表名将是一件麻烦的事情

方案B:

使用MySQL 8.0,您可以

WITH T AS ( SELECT ... )
SELECT ... FROM T ORDER BY col1
UNION ...
方案C:

如果可以这样做:

SELECT id FROM A
     ORDER BY col1 LIMIT 10
您可以将其用作内部的“派生”表

(SELECT * FROM A INNER JOIN B ... AND SOME COMPLEX WHERE CONDITIONS)
差不多

SELECT A.*, B.*
    FROM ( SELECT id FROM A
               ORDER BY col1 LIMIT 10 ) AS x1
    JOIN A  USING(id)
    JOIN B ... AND SOME COMPLEX WHERE CONDITIONS
同样,对于其他两个选择,则将它们合并在一起

更好的是,将3组ID合并在一起,然后连接到A和B一次


这可能具有处理较少行的优点。

显然执行了3次。。您在不同的列上使用order by,为了获得结果,所有3个子查询都被完全执行。子查询完全相同!所以T别名是一样的,在第二次我在不同的列中排序时,我对此没有问题。我只询问子查询3个子查询已完成。。dinamic表不能重复使用。。对于db引擎,3次查询甚至是3次新查询。如果您想要更好的性能,请确保在用于筛选的列上有适当的索引。我可以做些什么来避免3次执行?如果您想要基于不同顺序的3组不同的10行。。。您无法避免3查询。。。是SQL。。这不是魔法。。在同一个查询中不可能有3个不同的东西