【发布时间】:2021-05-14 14:12:37
【问题描述】:
我正在尝试优化此查询的速度:
SELECT t.t_date td, v.visit_date vd
FROM temp_dates t
LEFT JOIN visits v ON DATE_FORMAT(v.visit_date, '%Y-%m-%d') = t.t_date
ORDER BY t.t_date
v.visit_date 是 DATETIME 类型,t.t_date 是格式为 '%Y-%m-%d' 的字符串。
简单地在 v.visitdate 上创建索引并没有提高速度。因此,我打算尝试@oysteing 在这里给出的解决方案:
How to optimize mysql group by with DATE_FORMAT
我通过这个 SQL 成功创建了一个虚拟列
ALTER TABLE visits ADD COLUMN datestr varchar(10) AS (DATE_FORMAT(visit_date, '%Y-%m-%d')) VIRTUAL;
但是,当我尝试在此列上创建索引时
CREATE INDEX idx_visit_date on visits(datestr)我收到这个错误:
#1901 - 函数或表达式 'date_format()' 不能在
datestr的 GENERATED ALWAYS AS 子句中使用
我做错了什么?我的数据库是 Maria DB 10.4.8
最好的问候 - 乌尔里希
【问题讨论】:
-
你应该修复右侧并将
t_date提升为datetime... -
注意函数不能使用索引:-(
标签: mysql datetime mariadb query-optimization virtual-column