我有一个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
答案 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;