我有一个如下所示的查询:
SELECT * from foo
WHERE days >= DATEDIFF(CURDATE(), last_day)
在这种情况下,days
是一个 INT
。 last_day
是一个 DATE
列。
所以我需要为 days
和 last_day
设置两个单独的索引?
最佳答案
这个查询谓词,days >= DATEDIFF(CURDATE(), last_day)
, 本质上不是 sargeable .
如果您保留当前的表设计,您可能会受益于 (last_day, days)
上的复合索引.然而,满足查询需要对该索引进行全面扫描。
这些列之一或两者上的单列索引对于提高此查询的性能将毫无用处或更糟。
如果您必须让这个查询执行得很好,您需要稍微重组一下您的表。让我们弄清楚。看起来您正在尝试排除“过期”记录:您想要 expiration_date < CURDATE()
. 那是一个可搜索的搜索谓词。
因此,如果您添加了一个新列 expiration_date
到您的表,然后按如下方式设置:
UPDATE foo SET expiration_date = last_day + INTERVAL days DAY
然后对其进行索引,您将获得性能良好的查询。
关于mysql - 应该在此处索引哪些键以使此查询最佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38234601/