2011-09-03 76 views
1

我使用UNION查询从两个表中提取基于日期的数据。下面优化一个UNION mysql查询

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每个表...问题是,查询不优化,当我使用解释同时显示被选中的表中的所有行给我输出。

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

+0

为限制选定的行,您的WHERE条件看起来有点截断。你有没有遗漏什么? –

+0

不,我没有。即使我删除where子句,所选查询仍然等于每个表中的总行数。 – user350230

+1

好吧,他们会的,他们不会。除了' .id'需要包含一个值为true的值以外,您没有相等或其他术语来限制'WHERE'语句。通常它会有一个限制性术语,例如'column = value'或'column> value'或'value1和value2之间的列'等。 –

回答

0

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

也许这个问题可以应用到你的情况,以及:

Combining UNION and LIMIT operations in MySQL query

2

什么你基本上呈现的是,你有你的模型的设计问题,即它似乎是错误的选择implemententing超时作出/亚型。您的功能要求是将来自两个不同表格的(相似)数据作为一个统一集合。如果所有这些行都在一个表中,这将是直截了当的。所以真正的问题是为什么他们不是。

你仍然可以更快地获得这个查询(我认为),但它很丑。

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