Как выставить индексы для 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. можно ли не меняя запроса (не разбивая его на два) добиться нормального быстродействия?
  • Вопрос задан
  • 326 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
OR, как и UNION DISTINCT, плохо работает при большом перекрытии данных.
Скажем, у вас в таблице миллион строк. По первому условию выбралось полмиллиона, по второму ещё полмиллиона. Если взять OR, то сколько уникальных строк должно быть в результате? Вот на выборке только уникальных строк и идут тормоза.
Быстро работает UNION ALL, но он не удаляет дубли строк.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы