Разумеется, читал. Все, что там по теме: Beware of large LIMIT ))) разделим задачу на части: - поиск по произвольному условию. Тут мало что можно сделать. - поиск по заранее известному условию, хотя бы where 1 order by id desc пока на ум приходят только иметь заведомо редко изменяемую часть и хранить отдельно ее объем. в идеале - кешировать (хранить метки) результаты по каждому условию. Насколько это пересечется с кешированием вообще - вопрос.
да, а пока у меня так: select * from ((select id from () where $where order by ... limit $from, $to) tmp, $join) это ускоряет на порядок (в filesort идет не вся таблица, а ид), но все равно 128682-тая страница формируется полторы секунды.
если до этого было limit 1999980,20 то можно запомнить последний id и ставить в запрос [sql]select * from () where id>$last_id limit 20[/sql] По идее должно ускорить. З.Ы. В мускуле сильно не хватает rownum
да, выглядит полезным сделать так, чтобы limit 100000,20 ускорял последующий limit 2000000,20 но надо это формализовать - как хранить флаги, что эти метки не устарели и т.п. какой будет объем такой вспомогательной таблицы. других идей нет? rownum чего? для вариантов asc, desc, where date>$xxx или $type in(2,3) ?
пример в комментах (#58 ) по ссылке Олега. where id>(select max... limit ... аналогичен по скорости (select id ... limit ...) tmp where tmp.id=... но похоже чуть проще визуально. так же как и варианты с select count(*) пример в комментах (#61) мне непонятен. Я что-то делаю не так? апдейт: а, понял, он не использует order by и выдает произвольные 20. все равно странно. или у него не соблюдается порядок при удалении/вставке, или одно из двух.. http://www.pinkbike.com/photo/list/?dat ... age=124707 хмм.
и отдельная тема - что делать с подсчетом общего кол-ва. Он все равно используется, надо и его подсчет оптимизировать и его использовать. alBoo с партициями интересно, но тут объема памяти должно хватать.
Пихать ID последней записи вместо номера следующей страницы. Тогда получиться красивый запрос: PHP: <?php $res = $db->query('SELECT * FROM table WHERE id > '.(int)$id.' LIMIT 20');
topas Смотря какая. Как правило она идёт в порядке добавления, т.е. по возрастанию ID, так что ORDER BY id ASC. Если нужно DESC, то делаем WHERE id < $id
Здесь во флуде со всех сторон обсосали http://habrahabr.ru/blogs/mysql/41968/ А реально живой вариант только один пока щупал - Sphinx'a прикрутить.
armadillo Это поисковой движок, и он умеет искать по куче критериев, т.е. можно сказать "хочу все записи по такому условию с N-ой и 20 штук". Он тебе их и выдаст значительно быстрее MySQL'a.