За последние 24 часа нас посетили 17869 программистов и 1610 роботов. Сейчас ищут 896 программистов ...

Кривой запрос к MySQL?

Тема в разделе "PHP и базы данных", создана пользователем Ksaniol, 14 окт 2010.

  1. Ksaniol

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

    С нами с:
    13 окт 2010
    Сообщения:
    15
    Симпатии:
    0
    Помогите разобраться. Может я туплю, но что-то явно не так.

    Суть проблемы:
    В базе данных 10826 записей. Мне нужен их постраничный вывод. Проблема с запросом для вывода последней страницы. Записи сортируются по id в обратном порядке.

    1. Запрашиваем последние строки (шаг запроса 100)
    SQL-запрос: SELECT * FROM `table` ORDER BY `id` DESC LIMIT 10800,100;
    Запрос занял 5.1798 сек

    2. Запрашиваем только оставшиеся строки без учёта шага, до записи с id = 1 (по сути это аналогичный первому варианту запрос)
    SQL-запрос: SELECT * FROM `table` ORDER BY `id` DESC LIMIT 10800,26;
    Запрос занял 5.1642 сек

    3. Запрашиваем последние 25 строк, но без строки с id = 1, т.е. она просто не попадает в лимит
    SQL-запрос: SELECT * FROM `table` ORDER BY `id` DESC LIMIT 10800,25;
    Запрос занял 0.1064 сек


    Никак не могу понять, почему запрос становится таким "тяжелым", если включить в запрос последнюю (точнее первую по id) строку?

    Если выделять только id вместо всх полей (SELECT `id`...) этой проблемы не возникает.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а что в ней ? =)
     
  3. Ksaniol

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

    С нами с:
    13 окт 2010
    Сообщения:
    15
    Симпатии:
    0
    таблица юзеров (это не суть, т.к. с остальными таблицами такая же проблема)
     
  4. Ksaniol

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

    С нами с:
    13 окт 2010
    Сообщения:
    15
    Симпатии:
    0
    даже есть выделяю id и еще какой-то целочисленный столбец - загрузка большая, т.е. видимо это не из-за какого-либо формата данных остальных столбцов
     
  5. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Ksaniol
    предполагаю, что дело в выделении памяти для мускула.
    если до 25 записей - то памяти хватает, а если более, то уже нет.

    Может быть стоит попробовать увеличить доступную память?
     
  6. Ksaniol

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

    С нами с:
    13 окт 2010
    Сообщения:
    15
    Симпатии:
    0
    точно не в этом, т.к. нет разницы 100 строк выделю или всего 1

    1. SQL-запрос: SELECT * FROM `table` ORDER BY `id` DESC LIMIT 10825,1;
    Запрос занял 5.1468 сек

    2. SQL-запрос: SELECT * FROM `table` ORDER BY `id` DESC LIMIT 10725,100;
    Запрос занял 0.1011 сек

    3. SQL-запрос: SELECT * FROM `table` ORDER BY `id` DESC LIMIT 10725,101;
    Запрос занял 5.1779 сек
     
  7. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    видимо действительно дело в одной записи. круто нашёл проблемку :)
    если там данных не так уж и много, но тормозит, попробуй эту запись полностью пересоздать
     
  8. Ksaniol

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

    С нами с:
    13 окт 2010
    Сообщения:
    15
    Симпатии:
    0
    это не зависит именно от этой записи, т.к. аналогичная проблема не только с этой таблицей ((

    никто не сталкивался с подобным?
     
  9. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Брр, сорри если не в тему, а что нельзя так?

    SELECT * FROM `table` ORDER BY `id` ASC LIMIT 0,25
     
  10. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    попробуй REPAIR TABLE `table`
     
  11. Ksaniol

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

    С нами с:
    13 окт 2010
    Сообщения:
    15
    Симпатии:
    0
    нельзя, т.к. постраничный перебор идёт в обратном порядке

    не помогает

    скрипт работал на денвере, сейчас поставил его на сервер, таких проблем не обнаружено. значит это проблема не в запросе (( теперь еще сложнее будет выяснить в чём дело
     
  12. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    А по моему ASC это и есть обратный к DESC :)
     
  13. Ksaniol

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

    С нами с:
    13 окт 2010
    Сообщения:
    15
    Симпатии:
    0
    ясен пень, обойти гору и нагородить кучу условий чтобы в конце заменить DESC на ASC это не выход
     
  14. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    тогда совсем непонятна задача...
    если тебе надо получить 25 строк из базы, то в чем разница?