Как выставить индексы для OR-запроса?

Добрый день.

Есть таблица вида
ID - int, auto increment
A - char(8) DEFAULT NULL,
B - char(8) DEFAULT NULL


И два индекса на поля A и B.

В такой таблице запрос вида SELECT count(*) from table WHERE A=xxx OR B=xxx выполняется неадекватно долго, хотя EXPLAIN показывает, что все (вроде бы?) хорошо:
possible_keys: A,B
          key: A,B
        Extra: Using union(A,B); Using where


Если разбить этот запрос на два - они отрабатывают моментально, но по разным причинам мне это не подходит.

Вопрос заключается в следующем:
1. почему этот запрос так сильно тормозит?
2. можно ли не меняя запроса (не разбивая его на два) добиться нормального быстродействия?
  • Вопрос задан
  • 309 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
OR, как и UNION DISTINCT, плохо работает при большом перекрытии данных.
Скажем, у вас в таблице миллион строк. По первому условию выбралось полмиллиона, по второму ещё полмиллиона. Если взять OR, то сколько уникальных строк должно быть в результате? Вот на выборке только уникальных строк и идут тормоза.
Быстро работает UNION ALL, но он не удаляет дубли строк.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
1. потому что движок будет строить union(A,B), а это небыстро. мускулу это противопоказано. вообще никогда не заставляйте мускул сравнивать строки или искать в них, он это умеет очень плохо.
2. объединять поле в одно через разделитель и вешать полнотекстовый индекс. но это все равно будет медленнее двух отдельных запросов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы