Здравствуйте.
По каким правилам делаются составные индексы для сложных условий с вариантами и сравнениями?
Пример 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. Действительно ли это так?