如何使用DATE_FORMAT优化mysql组

时间:2018-06-20 02:50:47

标签: mysql sql database query-optimization sql-date-functions

我有一个SQL。

select  count(id) as total, DATE_FORMAT(create_time,"%Y-%m-%d") as create_date
    from  table_name
    group by  DATE_FORMAT(create_time,"%Y-%m-%d");

然后定义create_time列。

`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP

据我所知,函数 DATE_FORMAT 不采用索引,因此我的执行速度非常慢。有什么方法可以优化它?

  

mysql版本:5.6.34

3 个答案:

答案 0 :(得分:0)

我会尝试使用应该利用索引的LEFT(create_time,10)。

答案 1 :(得分:0)

这不会加快速度,但是更干净:

select  count(*) as total,
        DATE(create_time) as create_date
    from  table_name
    group by  DATE(create_time);

COUNT(id)检查id是否为NOT NULL;这可能是不必要的。

INDEX(create_time)将帮助一些,但是它所要做的就是将“表扫描”变成“索引扫描”。

如果这是一个数据仓库应用程序(成千上万的一次写入行,大量的“报告”),那么我们可以讨论使这种查询的运行速度更快的方法。

答案 2 :(得分:0)

您可以创建一个生成的列并在该列上创建索引:

ALTER TABLE table_name ADD COLUMN create_date DATE AS (DATE(create_time)) VIRTUAL;
CREATE INDEX idx ON table_name(create_date);

由于生成的列是虚拟的,因此不会使用任何空间。 (但是,索引当然会占用额外的空间。)然后,您可以在查询中使用此生成的列:

SELECT COUNT(*), create_date FROM t2 GROUP BY create_date;