Создание индексов для оператора «ИЛИ» в запросах - PullRequest
3 голосов
/ 30 августа 2010

У меня есть несколько запросов MySQL с условиями вроде

where field1=val1 or field2=val2

и некоторые подобные

where fieldx=valx and fieldy=valy and (field1=val1 or field2=val2)

Как я могу оптимизировать эти запросы путем создания индексов? Моя интуиция состоит в том, чтобы создать отдельные индексы для field1 и field2 для первого запроса, так как это OR, поэтому составной индекс, вероятно, не принесет много пользы.

Для второго запроса я намерен снова создать 2 индекса: fieldx, fieldy, field1 и fieldx, fieldy, field2 по вышеуказанной причине.

Правильно ли это решение? Это очень большая таблица, поэтому я не могу просто поэкспериментировать с применением индексов и объяснением запроса.

Ответы [ 2 ]

4 голосов
/ 30 августа 2010

Как и во всех вопросах оптимизации СУБД, это зависит от вашего механизма исполнения.

Я бы начал с самого простого сценария, четырех отдельных индексов на каждый из столбцов.

Это обеспечитлюбые запросы, использующие эти столбцы таким образом, которого вы не ожидали, будут по-прежнему работать нормально (индекс fieldx/fieldy/field1 будет бесполезен для запроса, использующего только fieldy).

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

Затем и только , если у вас есть проблемы с производительностью, вы можете посмотретьв улучшение его с различными показателями.Вы должны тестировать производительность на данных производственного типа, а не на любых тестовых базах данных, которые вы сами создали (если они в любом случае не отражают атрибуты производства).

И помните, что настройка базы данных редко бывает заданной и забываемойоперация.Вам следует периодически перенастраиваться, потому что производительность зависит как от схемы , так и от данных, которые вы храните.

Даже если схема никогда не меняется, данные могут сильно отличаться.В ответ на ваш комментарий «Я просто не могу экспериментировать, применяя индексы и объясняя запрос», это ровно , что вы должны делать.

Если вы беспокоитесь по поводу игры на производстве (и вам следуетбыть), у вас должна быть настроена другая среда с аналогичными спецификациями, скопируйте в нее производственные данные, а затем возьмите ваши индексы там.

2 голосов
/ 30 августа 2010

Моя интуиция заключается в создании отдельного индексы для field1 и field2 для первый запрос, как это ИЛИ, так что составной индекс, вероятно, не будет делать много хорошо.

Это верно.

Для второго запроса я собираюсь создать 2 индексы: fieldx, fieldy, field1 и fieldx, fieldy, field2 снова для вышеуказанная причина.

Это один из вариантов, другой будет индексом для fieldx, fieldy, field1 и индексом для field2 (так же, как для первого запроса!). Теперь у вас также есть 2 индекса, но второй будет намного меньше. Ваш второй запрос может использовать оба индекса: больший для AND-части вашего запроса и маленький индекс для OR-части field2. MySQL должен быть достаточно умным в наши дни.

EXPLAIN поможет вам.

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