我使用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的组合