优化UNION mysql查询

时间:2011-09-03 08:17:41

标签: mysql union

我正在使用UNION查询根据日期从两个表中提取数据。查询以下

SELECT title, id, date as date_added 
FROM test1 WHERE test1.id
UNION 
SELECT title, customer as id, date_added    
FROM test2 WHERE test2.id 
ORDER BY date_added DESC LIMIT 0,8

我在每个表上都有一个日期索引和date_added ...问题是查询没有优化,当我使用EXPLAIN时,它显示两个表的所有行都被选中以给我输出。

是否有其他方法可以对此查询进行优化?我能想到的唯一解决方案是使用LIMITS分别运行两个查询并对应用程序中的数据进行排序,但似乎不可能在我的应用程序中执行分页。

2 个答案:

答案 0 :(得分:2)

您基本上展示的是您的模型中存在设计问题,在实施超级/子类型时似乎做出了错误的选择。您的功能要求是将来自两个不同表的(simular)数据作为一个统一集。如果所有这些行都在一个表中,这将是直截了当的。所以真正的问题是为什么他们不是。

你仍然可以更快地得到这个查询(我猜)但它很难看。

SELECT * FROM 
   (SELECT * FROM (select title, id, date as date_added from test1 
                  ORDER BY date_added DESC LIMIT 0,8) t1
    UNION ALL 
    SELECT * FROM (select title, customer as id, date_added from test2 
                  ORDER BY date_added DESC LIMIT 0,8) t2
   ) joined
ORDER BY date_added DESC
LIMIT 0,8 

答案 1 :(得分:0)

我不是最好的专家,但我认为因为UNION mysql需要在执行ORDER之前选择并合并两个结果集,因此,潜力可能由LIMIT子句提供的结果集优化不会发生。

也许这个问题也适用于你的案例:

Combining UNION and LIMIT operations in MySQL query

相关问题