LINUX.ORG.RU

Как лучше select * from X where Z<A order by Z desc limit 1 в MySQL?


0

0

Есть такая задача: надо найти самый большой элемент 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;

anonymous

См. в доках инфу по explain, что бы узреть, какие индексы используются.

select max(Z) from X where Z<A и select min(Z) from X where Z>A работают сильно по-разному скорее всего из-за того, что Z делит данные на очень неравное количество записей. Например, первый запрос может отбирать 10000000 записей, а второй всего 100. Сделать min/max по ста записям гораздо быстрее =)

Отсюда вывод - нужно знать распределение Z =)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.