如何使用 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;
我有一个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;