如何用date\u格式优化mysql group

oxalkeyp  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(266)

我有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` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP

据我所知,函数date\u格式没有索引,所以我的执行速度非常慢。有什么办法可以优化它吗?
mysql数据库version:5.6.34

p4rjhz4m

p4rjhz4m1#

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

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)` 会有所帮助,但它所能做的只是把“表扫描”变成“索引扫描”。
如果这是一个数据仓库应用程序(无数的只写一次的行,大量的“报告”),那么我们可以讨论让这样的查询运行得更快的方法。
2nbm6dog

2nbm6dog2#

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

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;
qaxu7uf2

qaxu7uf23#

我会尝试向左(创建时间,10),这应该利用索引。

相关问题