ОГРАНИЧЕНИЕ ЛИНИИ, ДЛИНА, ЗАПРАШИВАЕТСЯ для разбивки на страницы?

У меня есть таблица MyISAM с 28 900 штуками. Я обрабатываю его в кусках в 1500, что вызывает такой запрос:

SELECT * FROM table WHERE id>0 LIMIT $iStart,1500

Затем я перебираю это и каждый раз увеличиваю $iStart на 1500.

Проблема заключается в том, что в некоторых случаях запросы возвращают одни и те же строки. Например, запрос LIMIT 0,1500 возвращает некоторые из тех же строк, что и запрос LIMIT 28500,1500.

Если я не заказываю строки, не могу ли я использовать LIMIT для разбивки на страницы?

(Таблица статична, пока эти запросы происходят, никаких других запросов не происходит, что изменит ее строки).

Ответ 1

Как и во всех других машинах SQL, таблицы MySQL MyISAM не дают никаких гарантий относительно порядка, в котором строки возвращаются, если вы не укажете предложение ORDER BY. Обычно порядок, в который они возвращаются, будет порядком их считывания с файловой системы, который может изменяться от запроса к запросу в зависимости от обновлений, удалений и даже состояния кешированных выборок.

Если вы хотите, чтобы одна и та же строка возвращалась более одного раза, вы должны заказать что-то, причем основным ключом является наиболее очевидный кандидат.

Ответ 2

Вы должны использовать ORDER BY для обеспечения последовательного заказа. В противном случае СУБД может возвращать строки в произвольном порядке (однако можно предположить, что он произволен, но согласован между запросами, если ни одна строка не изменяется).