ОГРАНИЧЕНИЕ ЛИНИИ, ДЛИНА, ЗАПРАШИВАЕТСЯ для разбивки на страницы?
У меня есть таблица 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 для обеспечения последовательного заказа. В противном случае СУБД может возвращать строки в произвольном порядке (однако можно предположить, что он произволен, но согласован между запросами, если ни одна строка не изменяется).