Есть такая задача: надо найти самый большой элемент Z, меньший некого значения А. Столбец Z проиндексирован. Следующие запросы безумно тормозят:
select * from X where Z<A order by Z desc limit 1;
select max(Z) from X where Z<A;
Однако, если спросить наоборот - все очень быстро:
select min(Z) from X where Z>A;
Похоже, что индекс работает как-бы в одну сторону. Как бы соптимизировать? Сейчас используется что-то нижеслежующего вида, но значение B достаточно отличается от A (для гарантированности непустого ответа), так что тормоза не сильно уменьшаются:
select * from X where (Z<A)AND(Z>B) order by Z desc limit 1;