如何使用 DATE_FORMAT 优化 mysql 组

How to optimize mysql group by with DATE_FORMAT

我有一个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 version:5.6.34

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

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

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) 会帮助 一些 ,但它所做的只是将 "table scan" 变成 "index scan"。

如果这是一个数据仓库应用程序(无数的一次写入行,很多 "reports"),那么我们可以讨论如何使这样的查询速度提高 运行 个数量级。

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

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

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

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