За последние 24 часа нас посетили 17637 программистов и 1596 роботов. Сейчас ищут 1533 программиста ...

limit 2000000,20

Тема в разделе "Решения, алгоритмы", создана пользователем armadillo, 27 фев 2009.

  1. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    у кого-то были идеи как ускорить? ))
     
  2. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Разумеется, читал.
    Все, что там по теме: Beware of large LIMIT
    )))

    разделим задачу на части:
    - поиск по произвольному условию. Тут мало что можно сделать.
    - поиск по заранее известному условию, хотя бы where 1 order by id desc

    пока на ум приходят только иметь заведомо редко изменяемую часть и хранить отдельно ее объем.
    в идеале - кешировать (хранить метки) результаты по каждому условию. Насколько это пересечется с кешированием вообще - вопрос.
     
  3. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    да, а пока у меня так:
    select * from ((select id from () where $where order by ... limit $from, $to) tmp, $join)
    это ускоряет на порядок (в filesort идет не вся таблица, а ид), но все равно 128682-тая страница формируется полторы секунды.
     
  4. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    если до этого было limit 1999980,20 то можно запомнить последний id и ставить в запрос [sql]select * from () where id>$last_id limit 20[/sql]
    По идее должно ускорить.

    З.Ы. В мускуле сильно не хватает rownum
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    да, выглядит полезным сделать так, чтобы limit 100000,20 ускорял последующий limit 2000000,20
    но надо это формализовать - как хранить флаги, что эти метки не устарели и т.п.
    какой будет объем такой вспомогательной таблицы.

    других идей нет?


    rownum чего? для вариантов asc, desc, where date>$xxx или $type in(2,3) ?
     
  6. alBoo

    alBoo Активный пользователь

    С нами с:
    27 мар 2008
    Сообщения:
    63
    Симпатии:
    0
  7. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    пример в комментах (#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

    хмм.
     
  8. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    и отдельная тема - что делать с подсчетом общего кол-ва. Он все равно используется, надо и его подсчет оптимизировать и его использовать.

    alBoo
    с партициями интересно, но тут объема памяти должно хватать.
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Хранить в другой таблице и изменять, по надобности?
     
  10. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Пихать ID последней записи вместо номера следующей страницы. Тогда получиться красивый запрос:
    PHP:
    1. <?php
    2. $res = $db->query('SELECT * FROM table WHERE id > '.(int)$id.' LIMIT 20');
    3.  
     
  11. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Psih
    А сортировка?
     
  12. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    topas
    Смотря какая. Как правило она идёт в порядке добавления, т.е. по возрастанию ID, так что ORDER BY id ASC. Если нужно DESC, то делаем WHERE id < $id
     
  13. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Psih
    по дате например
     
  14. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    только для следующей страницы - да, но ветка не об этом. на 100к страницу так не переходят.
     
  15. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Мне почему то кажется, что на 100К страницу кроме ботов никто не ходит.
    Или я не прав?
     
  16. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Есть еще варианты кто и зачем, но ветка не "придумаем почему не надо"
     
  17. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Здесь во флуде со всех сторон обсосали
    http://habrahabr.ru/blogs/mysql/41968/

    А реально живой вариант только один пока щупал - Sphinx'a прикрутить.
     
  18. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    и как поможет сфинкс лимиту?
     
  19. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    armadillo
    Это поисковой движок, и он умеет искать по куче критериев, т.е. можно сказать "хочу все записи по такому условию с N-ой и 20 штук". Он тебе их и выдаст значительно быстрее MySQL'a.
     
  20. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0