使用cakephp从mysql数据库中获取大量数据

时间:2014-05-21 06:07:47

标签: php mysql cakephp

我有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"
        }
    }
]

3 个答案:

答案 0 :(得分:2)

我建议你让一个表device_updates添加一个列,其中你可以有1-7个数字,但是现在需要为{{1}上的所有7个表添加索引}列然后使用device_time ,imei因此它不会删除重复项,使用union MySQL将组合的日期集排序到临时表中,一旦数据集被排序它将删除重复项,以优化它推送UNION ALL,{{每个子查询中的1}}和ORDER BY条件

LIMIT

确保为where子句中的列添加索引,我会说只需选择需要使用select *的列,如果列数太多,也会降低速度

For reference

答案 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;