我有7个名为' device_1_updates',' device_2_updates' device_3_updates' ...' device_7_updates'。
我正在使用UNION来处理来自这7个表的数据,但这花费了太多时间..因为这7个表中的每个表中的数据都太重了。
请建议一些方法来加快速度
我的SQL查询是:
SELECT
*
FROM
(SELECT
*
FROM
device_1_updates
UNION
SELECT
*
FROM
device_1_updates
UNION
SELECT
*
FROM
device_2_updates
UNION
SELECT
*
FROM
device_3_updates
UNION
SELECT
*
FROM
device_4_updates
UNION
SELECT
*
FROM
device_5_updates
UNION
SELECT
*
FROM
device_6_updates
UNION
SELECT
*
FROM
device_7_updates) AS device_data
WHERE device_time > '2014-04-05 01:55:08'
AND device_time < '2014-04-11 11:55:08'
AND imei = 357804045965906
ORDER BY device_time ASC
LIMIT 0, 100
并且相应的响应是:
"response": [{
"device_data": {
"imei": "357804045965906",
"device_time": "2014-04-02 15:57:52",
"lat": "",
"lang": "",
"event": "^6"
}
}, {
"device_data": {
"imei": "357804045965906",
"device_time": "2014-04-02 15:58:02",
"lat": "",
"lang": "",
"event": "^4"
}
}, {
"device_data": {
"imei": "357804045965906",
"device_time": "2014-04-02 15:58:14",
"lat": "",
"lang": "",
"event": "^8"
}
}, {
"device_data": {
"imei": "357804045965906",
"device_time": "2014-04-02 15:58:19",
"lat": "",
"lang": "",
"event": "^1"
}
}
]
答案 0 :(得分:2)
我建议你让一个表device_updates
添加一个列,其中你可以有1-7个数字,但是现在需要为{{1}上的所有7个表添加索引}列然后使用device_time ,imei
因此它不会删除重复项,使用union MySQL将组合的日期集排序到临时表中,一旦数据集被排序它将删除重复项,以优化它推送UNION ALL
,{{每个子查询中的1}}和ORDER BY
条件
LIMIT
确保为where子句中的列添加索引,我会说只需选择需要使用select *的列,如果列数太多,也会降低速度
答案 1 :(得分:0)
加速查询的最简单方法是使用UNION ALL而不是UNION。 UNION只返回不同的值,这意味着它必须检查它们是否是不同的。 UNION ALL返回所有内容,包括重复项。因此,如果表不包含重复数据,请使用UNION ALL。
为了更进一步,你需要确保你有适当的索引。
答案 2 :(得分:0)
据我所知,UNION在SQL中是一个非常慢的操作。对于你的代码,似乎device_2_updates,device_3_updates等是相等的,不是吗?
在我看来,你可以做的是将所有表格合并为一个: DEVICE_UPDATES: device_id , imei , device_time , lat , lang ,事件强>
并定义至少三个索引: device_id , imei , device_time
你可以做的另一件事(我不确定这是否会提高性能)是改变你的WHERE子句,而不是使用 device_time&lt; &#39;时间1&#39;和device_time&gt; &#39; time2&#39; ,在&#39; time1&#39;之间使用 device_time和&#39; time2&#39; 。