带索引的MySQL查询的性能比1好于0

时间:2018-06-29 14:25:08

标签: mysql sql indexing

我有以下查询,其中Date的数据类型为non-nullable date-timeGroupingId的数据类型为non-nullable int,而IsCompleted的数据类型为{{ 1}}。

non-nullable tinyint(1)

我在此表上的索引依次为SELECT * FROM Table WHERE Date < @TimeNow AND GroupingId = @GroupingId AND IsCompleted = 0; GroupingIdDate

由于某种原因,如果我使用IsCompleted运行此查询,则每次执行的速度都比t.IsCompleted = 0慢得多。

我认为它可能无法有效地建立索引,但可以在此方面提供一些帮助。

编辑

我已经更新了示例查询,以使其更加清晰。设置t.IsCompleted = 1时,与设置IsCompleted = 0相比,返回的行少得多,并且花费的时间长得多

1 个答案:

答案 0 :(得分:1)

您的查询无法使用索引进行排序。因此,查询的性能将由与where条件匹配的行数决定。推测,IsCompleted = 0的项目多于IsCompleted = 1

此查询的最佳索引是(groupingId, isCompleted, date)。前两个键可以是任意顺序。

这种情况:

((t.Date >= @StartDate AND t.Date < @EndDate) OR (t.Date < @TimeNow))  

也有点奇怪。我希望大多数或所有日期都在过去。假设@TimeNow代表当前日期,则将返回所有行。