2015-09-30 26 views
1

我有我认为是一个非常基本的查询,但它需要很长时间才能运行。我的MySQL服务器的我可以加速一个相对简单的时间戳选择查询吗?

具体细节:

  • Ubuntu服务器14.04,运行64-bit作为VMware Workstation虚拟机
  • 2GB的RAM专用于VM

我的表m运行查询有33列:一个时间戳和32个有良好名称的列(例如LEW91_4)。目前在表中有大约250万条记录。井列的数据类型为float。索引是:

  • 柱:NDX,指数:PRIMARY
  • 柱:t_stamp,指数:C1_Flowst_stampndx

查询:

SELECT 
    DATE_FORMAT(t_stamp, '%m/%d/%Y %h:00 %p') as 'Date', 
    AVG(LEW91_1R97) as 'LEW91_1R97', 
    AVG(LEW91_2R97) as 'LEW91_2R97', 
    AVG(LEW91_3R97) as 'LEW91_3R97', 
    AVG(LEW91_4) as 'LEW91_4', 
    AVG(LEW97_1) as 'LEW97_1', 
    AVG(LEW97_3) as 'LEW97_3', 
    AVG(LEW97_4) as 'LEW97_4', 
    AVG(LEW97_6) as 'LEW97_6', 
    AVG(LEW97_7) as 'LEW97_7', 
    AVG(LEW97_8) as 'LEW97_8', 
    AVG(LEW97_12) as 'LEW97_12' 

    FROM C1_Flows 
    WHERE DAY(t_stamp) = 28 
    AND MONTH(t_stamp) = 09 
    AND YEAR(t_stamp) = 2015 
    GROUP BY DAY(t_stamp), HOUR(t_stamp) 

查询目前正在大致11秒当我从MySQL Workbench运行它时运行。当它从我用来开发HMI的基于Java的界面中运行时,它会超时出现“Read timed out”特定错误。

我在类似的服务器上运行了更复杂的查询(即连接,联合,if语句等),并且它们比这个运行得更快。有没有一种方法可以加快速度,或者我错过了一些明显的东西?

+0

从输出中忽略所有平均值的结果然而,当从不同的(Java)上下文中调用'read timed out'时听起来好奇。超时是否设置了某种实用性? – user2864740

+0

WHERE子句过滤之后,剩余多少条记录? –

+1

在t_stamp上加上一个索引并使用'WHERE t_stamp ='2015-09-28''看看是否有改进 – fthiella

回答

5

不要使用

WHERE DAY(t_stamp) = 28 
AND MONTH(t_stamp) = 09 
AND YEAR(t_stamp) = 2015 

改用

WHERE t_stamp >= '2015-09-28' AND t_stamp < '2015-09-29' 

WHERE t_stamp >= '2015-09-28' AND t_stamp < ADDDATE('2015-09-28', INTERVAL 1 DAY) 

,并已超过t_stamp的索引。按照你写的方式,每条记录都需要计算where子句,并且索引不能使用。

+0

这是行不通的,因为如果它恰好是午夜,它只会匹配't_stamp'。 – Barmar

+0

是@Barmar,赶上,改正! –

+0

这是有'DATE'字段相当大的帮助。如果您关心速度,您希望避免在WHERE子句中使用逻辑分支和函数调用。 – tadman

1

用途:

WHERE t_stamp BETWEEN '2015-09-28 00:00' AND '2015-09-28 23:59:59' 

以匹配该日所有时间戳。

这将使用索引。

相关问题