Индексированный запрос MySQL работает лучше с 1, чем с 0 - PullRequest
0 голосов
/ 29 июня 2018

У меня следующий запрос, где Date имеет тип данных non-nullable date-time, GroupingId имеет тип данных non-nullable int, а IsCompleted имеет тип данных non-nullable tinyint(1).

SELECT
    *
FROM
    Table
WHERE
    Date < @TimeNow
AND 
    GroupingId = @GroupingId
AND 
    IsCompleted = 0;

У меня есть индекс для этой таблицы GroupingId, Date, IsCompleted в этом порядке.

По какой-то причине, если я запускаю этот запрос с t.IsCompleted = 0, он выполняется намного медленнее, чем t.IsCompleted = 1 каждый раз.

Я думаю, что он не может быть эффективно проиндексирован, но мог бы помочь с этим.

EDIT

Я обновил пример запроса, чтобы сделать его более понятным. Когда установлен IsCompleted = 0, он возвращает намного меньше строк и занимает намного больше времени, чем когда установлен IsCompleted = 1

1 Ответ

0 голосов
/ 29 июня 2018

Ваш запрос не может использовать индекс для сортировки. Таким образом, производительность запроса будет зависеть от количества строк, соответствующих условиям where. Предположительно, больше предметов имеют IsCompleted = 0, чем IsCompleted = 1.

Лучший индекс для этого запроса - (groupingId, isCompleted, date). Первые две клавиши могут быть в любом порядке.

Это условие:

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

тоже немного странно. Я ожидаю, что большинство или все даты будут в прошлом. Если предположить, что @TimeNow представляет что-то вроде текущей даты, это вернет все строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...