В MYSQL было бы более эффективно выполнять несколько проверок AND или приведение к Date и использовать IN для проверки появления нескольких дат? - PullRequest
0 голосов
/ 24 июня 2019

Что мне нужно сделать

Мне нужно иметь возможность проверить мою базу данных MYSQL, чтобы увидеть, имеет ли запись начало datetime, которое происходит в выбранном списке дат.Могут быть пробелы в диапазонах дат, поэтому я не могу просто использовать простое field >= '12-12-2000 00:00:00 AND field < 12-20-2000 00:00:00.

У меня в голове два решения, но у меня недостаточно фактических данных, чтобы проверить, действительно либыло бы более эффективно использовать оператор IN или объединять несколько операторов AND для выполнения проверок.

В настоящее время мой мыслительный процесс приводит меня к двум вариантам.

с использованиемIN

SELECT * FROM myTable WHERE
    CAST(datefield as Date) IN ('12-12-2000', '12-13-2000', '12-15-2000', '12-20-2000');

Использование составных операторов AND

SELECT * FROM myTable WHERE
    (datefield >= '12-12-2000 00:00:00' AND datefield < '12-13-2000 00:00:00')
OR
    (datefield >= '12-13-2000 00:00:00' AND datefield < '12-14-2000 00:00:00')
OR
    (datefield >= '12-15-2000 00:00:00' AND datefield < '12-16-2000 00:00:00')
OR
    (datefield >= '12-20-2000 00:00:00' AND datefield < '12-21-2000 00:00:00')

Это два варианта, которые я придумал, однако я уверен, что естьЕсть более опытные разработчики SQL, которые имеют лучшие способы делать то, что я пытаюсь сделать.Я читал, что приведение происходит медленнее, чем просто И заканчивая дату и время начала, но я не уверен, будет ли это применимо, даже если у меня может быть 5-30 дат для проверки на запрос.

1 Ответ

2 голосов
/ 25 июня 2019

Метод CAST не может использовать индекс для столбца datefield.

MySQL часто не будет использовать индексы, когда у вас есть условие OR, поэтому это может быть необходимочтобы изменить вторую версию на UNION

SELECT * FROM mytable
WHERE (datefield >= '12-12-2000 00:00:00' AND datefield < '12-13-2000 00:00:00')
UNION ALL
SELECT * FROM mytable
WHERE (datefield >= '12-13-2000 00:00:00' AND datefield < '12-14-2000 00:00:00')
UNION ALL
SELECT * FROM mytable
WHERE (datefield >= '12-15-2000 00:00:00' AND datefield < '12-16-2000 00:00:00')
UNION ALL
SELECT * FROM mytable
WHERE (datefield >= '12-20-2000 00:00:00' AND datefield < '12-21-2000 00:00:00')

Кстати, ваши форматы даты неверны, они должны быть YYYY-MM-DD, а не MM-DD-YYYY.

Если вы используетеMySQL 5.7 или выше, - это способ индексирования версии CAST.Вы можете создать сгенерированный столбец со значением CAST(datefield AS DATE) и добавить индекс для этого столбца.

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