Как правильно составить индекс MySql для условий с OR, или сравнением двух полей?

Здравствуйте.
По каким правилам делаются составные индексы для сложных условий с вариантами и сравнениями?
Пример 1:
SELECT u.data FROM users u WHERE u.status = 0 AND (u.sps = 0 OR u.sps_cur <= u.sps) AND u.ban = 0

В данном случае проверяется, является ли поле sps - 0 и если это не так, оно сравнивается с другим полем.

Пример 2, запрос с JOIN:
SELECT u.data FROM users u 
LEFT JOIN post p ON u.id = p.uid 
WHERE (u.mode = '0' AND u.shows > p.showtime) OR (u.mode = '1' AND p.activeshows > p.showtime))


Второй пример сложнее, но с ним разобраться интереснее всего.
У поля u.mode имеется всего 2 состояния - 0 и 1 и оба они используются в запросе. Добавлять это поле в индекс не имеет смысла?
Помимо этого есть сравнение, как в первом примере, но сравниваются поля из разных таблиц u.shows > p.showtime в первом "подусловии" и только из прикрепленной во втором p.activeshows > p.showtime. Как поступать в таком случае?

Если предположение:
Для первого примера эффективнее всего будет добавление в индекс полей u.status, u.sps, u.ban - игнорируя u.sps_cur из сравнения, но тогда если произойдет сравнение будет использоваться лишь часть индекса до u.sps
Для второго только p.uid для таблицы post. Действительно ли это так?
  • Вопрос задан
  • 375 просмотров
Пригласить эксперта
Ответы на вопрос 1
slashinin
@slashinin
Задачи для PHP https://justcoding.ru
Пробуйте ставить индексы как считаете нужным, при этом смотрите каждый раз на план запроса, что бы видеть какие индексы были использованы, а как нет.

При этом помните, что MySQL будет использовать индексы строго в порядке их определения т.е. в какой последовательности они были указаны в таблицы, в такой их и надо использовать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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