【问题标题】:Mysql SUM and between dates taking long timeMysql SUM 和日期之间需要很长时间
【发布时间】:2013-06-10 16:31:37
【问题描述】:

我正在尝试使用 SUM 获取两个日期之间的结果,但是在循环中执行多个查询需要很长时间。以下是我的查询。

数据库表包含超过 1.5L 条记录,并且此计数将继续增加。并且还循环执行多个查询。

以下是我的查询:

SELECT TIME_FORMAT( SEC_TO_TIME( SUM( TIME_TO_SEC( run_hours ) ) ) , '%H:%i:%s' ) AS total_time
FROM excel_info
WHERE indus_id = 'IN-1086331' AND (date_time BETWEEN '2008-11-27' AND '2013-05-04')

数据库表结构:

CREATE TABLE IF NOT EXISTS `excel_info` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `indus_id` varchar(20) NOT NULL,
   `district` varchar(50) NOT NULL,
   `date_time` date NOT NULL,
   `run_hours` varchar(100) NOT NULL,
   `flag` varchar(100) NOT NULL,
   PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1844417 ;

提前致谢。

【问题讨论】:

    标签: date time-format


    【解决方案1】:

    添加包含您要过滤的列的索引:

    CREATE INDEX ix_indus_dt ON `excel_info` (`indus_id`, `date_time`);
    

    此外,在每个匹配的行上调用TIME_TO_SEC 会很昂贵。您可以将 run_hours 存储为整数。

    【讨论】:

    • @Barmar,我们还有其他选择可以减少更多时间吗?如果是的话,你能不能也请那些......提前谢谢
    • 我想不到。您可以为每一年创建单独的表,但您的查询跨越多年,这样会更糟。
    • 添加了将run_hours 存储为整数而不是时间字符串的建议。
    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多