我目前准备了以下查询:
select sum(amount) as total
from incomes
where (YEAR(date) = '2019' and MONTH(date) = '07')
and incomes.deleted_at is null
稍微回顾一下它,请注意表中包含大量数据花费的时间太长,因为它经历了所有这一切。我对优化查询了解不多,但是我想开始记录和研究这种情况,请阅读一点说明,尽管可以为日期类型字段创建index
,但MySQL
可以在这种情况下,WHERE
和YEAR
的列MONTH
的列被函数包装后,不要使用索引。这是正确的吗?我应该遵循哪些步骤来改善其性能?我应该尝试重组查询吗?
答案 0 :(得分:4)
我建议将查询编写为:
select sum(i.amount) as total
from incomes i
where i.date >= '2019-07-01' and
i.date < '2019-08-01' and
i.deleted_at is null;
此查询可以利用incomes(deleted_at, date, amount)
上的索引:
create index idx_incomes_deleted_at_date_amount on incomes(deleted_at, date, amount)