使用mysql中的日期类型字段优化查询

FeR*_*cHo 0 mysql sql indexing optimization

我目前准备了以下查询:

select sum(amount) as total 
  from incomes 
 where (YEAR(date) = '2019' and MONTH(date) = '07') 
   and incomes.deleted_at is null
Run Code Online (Sandbox Code Playgroud)

稍微回顾一下时,请注意表格中的大量数据花费的时间太长,因为它经历了所有这些。我对优化查询不太了解,但我想开始记录和研究这种情况,阅读一点注意,虽然可以index为日期类型字段创建一个,但MySQL不会在WHERE子句的列中使用索引在这种情况下被一个函数包裹着YEARMONTH。那么这是正确的吗?我应该遵循哪些步骤来提高其性能?我应该尝试重构我的查询吗?

Gor*_*off 5

我建议将查询写为:

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;
Run Code Online (Sandbox Code Playgroud)

此查询可以利用 上的索引incomes(deleted_at, date, amount)

create index idx_incomes_deleted_at_date_amount on incomes(deleted_at, date, amount)
Run Code Online (Sandbox Code Playgroud)