我正在使用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分别运行两个查询并对应用程序中的数据进行排序,但似乎不可能在我的应用程序中执行分页。
答案 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
子句提供的结果集优化不会发生。
也许这个问题也适用于你的案例: