优化UNION mysql查询



我使用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分别运行两个查询并对应用程序中的数据进行排序,但似乎不可能在我的应用程序中执行分页。

你基本上显示的是,你有一个设计问题,在你的模型中,它似乎是错误的选择,当实现超/子类型。您的功能需求是将来自两个不同表的(类似)数据作为一个统一的集合。如果所有这些行都在一个表中,这就很简单了。所以真正的问题是为什么他们没有。

你仍然可以得到这个查询更快(我认为),但它是丑陋的。

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 

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

也许这个问题也适用于你的情况:

MySQL查询中UNION和LIMIT的组合

最新更新