使用cakephp从mysql数据库获取重数据

使用cakephp从mysql数据库获取重数据,php,mysql,cakephp,Php,Mysql,Cakephp,我有7个类似的表,名为“设备1\u更新”、“设备2\u更新”、“设备3\u更新”…“设备7\u更新” 我正在使用UNION来处理这7个表中的数据,但这花费了太多的时间。。因为这7个表中的数据都太重了 请建议一些快速的方法 我的sql查询是: SELECT * FROM (SELECT * FROM device_1_updates UNION SELECT * FROM device_1_updates UNION

我有7个类似的表,名为“设备1\u更新”、“设备2\u更新”、“设备3\u更新”…“设备7\u更新”

我正在使用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

加速该查询的最简单方法是使用UNIONALL而不是UNION。UNION将只返回不同的值,这意味着它必须检查它们是否不同。UNION ALL返回所有内容,包括重复项。因此,如果表中不包含重复数据,请使用UNION ALL


为了更进一步,您需要确保有适当的索引

据我所知,联合在SQL中是一个非常慢的操作。对于您的代码,似乎设备2\u更新、设备3\u更新等都是相同的,不是吗

我认为,您可以将所有表合并到一个表中: 设备更新:设备id、imei、设备时间、lat、lang、事件

并定义至少三个索引:设备id、imei、设备时间


您可以做的另一件事是更改WHERE子句,而不是使用device\u time<'time1'和device\u time>'time2',我不确定这是否会提高性能,使用介于“time1”和“time2”之间的设备\u时间。

我建议您使用一个表设备\u更新,并添加一个列作为类型,其中可以有1-7个数字,但现在您需要为设备\u时间上的所有7个表添加索引,imei列然后使用UNION all,这样就不会删除重复项,使用union MySQL将组合的数据集排序到临时表中,一旦对数据集进行排序,它将删除重复项,以优化每个子查询中的push ORDER BY、LIMIT和WHERE条件

(SELECT * FROM  device_1_updates 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 )
UNION ALL
(query 2 with where limit and order by)
UNION ALL
(query 3 with where limit and order by)
.
.
.
.
ORDER BY device_time ASC LIMIT 0, 100 /*at the end of query add order by and limit*/
确保在where子句中为列添加索引,我想说的是,如果列太多,使用select*只选择需要的列也会降低速度


不确定MySQL如何优化查询。但是,在合并它们之前,请尝试将WHERE语句添加到每个表中。表上存在哪些索引?为什么有7张桌子听起来很奇怪。这也是slowI使用7个表的原因之一,因为每个表中都有大量的数据,每个表中大约有300 MB的数据,并且每秒钟都在增长。。不知道mysql在一个表中有多少数据。。猜猜看??谢谢WizKid,M Khalid Junaid,Mhouse和user3071296.:@user3517995正如MySQL文档所说,如果您运行Linux,MySQL表中最多可以有4TB的数据。所以别担心,把所有的表合并到一个表中。
(SELECT * FROM  device_1_updates 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 )
UNION ALL
(query 2 with where limit and order by)
UNION ALL
(query 3 with where limit and order by)
.
.
.
.
ORDER BY device_time ASC LIMIT 0, 100 /*at the end of query add order by and limit*/