Переосмысление в
SELECT * FROM t
WHERE a = '81' AND date_x > '2019-05-28'
UNION ALL
SELECT * FROM t
WHERE b = '81' AND date_x > '2019-05-28'
может иметь больше смысла, особенно если учесть производительность, рассмотреть эту структуру таблицы и индексирование.
CREATE TABLE t (
`id` INTEGER,
`a` INTEGER,
`b` INTEGER,
`date_x` VARCHAR(10)
, INDEX(a, date_x)
, INDEX(b, date_x)
);
Как
SELECT * FROM t
WHERE (a = '81' OR b = '81')
AND date_x > '2019-05-28';
не может использовать индексы, см. demo и, скорее всего, заканчивает сканирование полных файлов таблиц / индексов.
Поскольку оптимизатор MySQL основан на затратах, я также включил this , чтобы убедиться, что ПОЛНОЕ сканирование для первого запроса не было просто инициировано низким числом отключенных записей.Но ясно, что второй запрос имеет более стабильный план.
База данных Oracle, на мой взгляд, позволяет перезаписывать OR
до UNION ALL
непосредственно в этом оптимизаторе, если он проиндексирован.Поскольку MySQL принадлежит Oracle, я надеюсь, что они также добавят оптимизацию в MySQL.