Имеется большая таблица, записей возможно несколько милионов.
Нужно вытащить m строк, но начинать не с начала а места где остановились прошлый раз (вчера или неважно когда). место остановки это n. Место остановки можно хранить либо как номер строки либо как id. Так как id всегда будут по нарастающей, то можно использовать сравнение (id>n) для определения старта выборки. Либо если хранить номер строки то для определения начала выборки используем лимит с 2-мя параметрами (limit n,m).
Работают оба варианта, но какой быстрее?
Смущает что лимиту придётся вначале перейти на нужную строку, а следовательно и прочитать все предыдущие?
А если использовать сравнение. то sql наверняка понимает что id идут по нарастающей и возможно сравнение будет очень быстрым?
Посоветуйте что нить плз
limit n,m или where id>n limit m ?
Я бы хранил где-нить переменную с номером и не парился.
Советовать по скорости - посиди потести что быстрее..
Советовать по скорости - посиди потести что быстрее..
так переменная с номером и хранится, если мы прочитали 100 записей сегодня, то завтра начнём со 101-ой записи. Это не проблема. Проблема определить что лучше
limit 100,10 или where id>100 limit 10
тестить пока немогу. нету материала пока что. Прост мне кажется что тут есть какойто простой и напршивающийся момент...
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 для подобной оптимизации используют секционирование.
LIMIT 0,n работает как TOP n в MSJet(access), или как ROWNUM<n в Oracle.
Т.е. применяется limit уже после всех выборок и сортировок.
Тем более для LIMIT m,n должена сначала быть построена выборка, отсортирована как положено и т.п., но фетчиться она должна со строки m!
На мой взгляд это менее эффективно, чем where id>N
(Ну и конечно же id должно быть индексированным)
Не знаю как в MySQL, а в Oracle для подобной оптимизации используют секционирование.