应在此处索引哪些键以使此查询最佳

ran*_*its 0 mysql indexing datetime query-optimization

我有一个如下所示的查询:

SELECT * from foo
  WHERE days >= DATEDIFF(CURDATE(), last_day)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,days是一个INT. last_day是一个DATE专栏.

所以我在这里需要两个单独的索引dayslast_day

O. *_*nes 5

此查询谓词days >= DATEDIFF(CURDATE(), last_day)本身并不是可搜索的.

如果保留当前的表设计,您可能会从复合索引中受益(last_day, days).然而,满足查询将需要对该索引进行全面扫描.

其中一列或两者上的单列索引对于提高此查询的性能将是无用的或更糟.

如果您必须使此查询执行得非常好,则需要稍微重新组织您的表.让我们弄明白.您似乎想要排除"过期"记录:您想要 expiration_date < CURDATE().这是一个可搜索的搜索谓词.

因此,如果您向expiration_date表中添加了一个新列,然后按如下所示进行设置:

 UPDATE foo SET expiration_date = last_day + INTERVAL days DAY
Run Code Online (Sandbox Code Playgroud)

然后索引它,你会有一个表现良好的查询.