limit n,m или where id>n limit m ?

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
pashtet
Сообщения: 73
Зарегистрирован: 09 апр 2006, 10:53
Откуда: Белгород

Имеется большая таблица, записей возможно несколько милионов.
Нужно вытащить m строк, но начинать не с начала а места где остановились прошлый раз (вчера или неважно когда). место остановки это n. Место остановки можно хранить либо как номер строки либо как id. Так как id всегда будут по нарастающей, то можно использовать сравнение (id>n) для определения старта выборки. Либо если хранить номер строки то для определения начала выборки используем лимит с 2-мя параметрами (limit n,m).

Работают оба варианта, но какой быстрее?
Смущает что лимиту придётся вначале перейти на нужную строку, а следовательно и прочитать все предыдущие?
А если использовать сравнение. то sql наверняка понимает что id идут по нарастающей и возможно сравнение будет очень быстрым?

Посоветуйте что нить плз
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Я бы хранил где-нить переменную с номером и не парился.
Советовать по скорости - посиди потести что быстрее..
pashtet
Сообщения: 73
Зарегистрирован: 09 апр 2006, 10:53
Откуда: Белгород

так переменная с номером и хранится, если мы прочитали 100 записей сегодня, то завтра начнём со 101-ой записи. Это не проблема. Проблема определить что лучше
limit 100,10 или where id>100 limit 10
тестить пока немогу. нету материала пока что. Прост мне кажется что тут есть какойто простой и напршивающийся момент...
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Согласно документации LIMIT ограничивает выборку указанным количеством строк.
LIMIT 0,n работает как TOP n в MSJet(access), или как ROWNUM<n в Oracle.
Т.е. применяется limit уже после всех выборок и сортировок.
Тем более для LIMIT m,n должена сначала быть построена выборка, отсортирована как положено и т.п., но фетчиться она должна со строки m!
На мой взгляд это менее эффективно, чем where id>N
(Ну и конечно же id должно быть индексированным)
Не знаю как в MySQL, а в Oracle для подобной оптимизации используют секционирование.
Ответить