За последние 24 часа нас посетил 18871 программист и 1607 роботов. Сейчас ищут 874 программиста ...

Увеличить скорость отработки запросов

Тема в разделе "MySQL", создана пользователем Njin, 18 май 2013.

  1. Njin

    Njin Новичок

    С нами с:
    18 май 2013
    Сообщения:
    1
    Симпатии:
    0
    Доброго времени!

    Немного о задаче:
    Необходимо реализовать выборку статей в зависимости от выбранного раздела:

    Разделы имеют древовидную структуру с неограниченной вложенностью,
    в бд таблица разделов имеет поля id & parent_id, которые реализуют всю древовидность.

    Сами статьи привязываются только к "конечным" разделам, которые не имеют подразделов.

    Пример
    Т.е. если выбран Раздел 1, то нужно получить id Разделов 1.1.1, 1.1.2, 1.2.1, 1.3.1 и вывести все статьи, которые к ним привязаны.
    Проблема в том как это реализовано:
    Выбираются в начале айдишники детей Раздела 1, потом айдишники их детей, итого 4 запроса(в конкретном случае).
    Но на реальной базе в больших разделах до 100-500 запросов.
    Плюс выборка статьей по через section_id IN (массив из 100+ элементов) долгое занятие.

    Вопрос
    Как увеличить скорость работы, т.к. страница в итоге загружается за 10-15 секунд.
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    А что мешает выбрать все разделы (один запрос) и сгенерировать дерево с помощью php?
     
  3. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    посмотрите в сторону nestet sets - реализация иерархических баз данных на базе реляционных баз
     
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    если вложенность неглубокая, вам подойдет materialized path.
    реализация простейшая. скорость вполне приемлемая, в вашем случае - выборка будет одним запросом
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Я бы так сказал: если в аналоге из реального мира есть нумерация
    1.1
    1.2
    1.2.1
    то это жирный намек использовать материализованные пути в базе!