• Движок форума????

    @ZloiZmei
    Из платных ещё vbulletin не упомянули. Самый мощный из перечисленных.
    Ответ написан
    Комментировать
  • Как правильно писать "плагинное" приложение?

    Gorthauer87
    @Gorthauer87
    Программист
    Создаем либу, которая предоставляет общее sdk, обычно это набор абстрактных классов. Создаем класс Plugin, который содержит в себе необходимые точки входа, обычно это init для того, чтобы плагин сказал о том, что он умеет, load для того, чтобы плагин начал выполнять возложенные на него фичи и unload, для выгрузки. Далее делаем менеджер этих самых плагинов, который имеет в себе указатели на все доступные плагины, он уже разруливает что загружать, а что нет, а также разруливает всякие штуки наподобии зависимостей между плагинами.
    Работать такая связка будет столь же быстро, как и монолитное приложение, зато каждый плагин будет являться лишь кирпичиком и можно будет гораздо проще отлаживать. Такого рода незначительно влияет на скорость загрузки приложения (необходимо таки делать некоторые лишние телодвижения в рантайме) и незначительно на объем потребляемой памяти. Можно организовать обмен эвентами между плагинами, но гораздо проще и быстрее сделать плагины реализациями некоторых интерфейсов, а обмен событиями использовать лишь в небольшой части плагинов, где это реально нужно.
    Ответ написан
    4 комментария
  • Как выбрать одним запросом 5 последних записей каждой категории в MySQL?

    kozlice
    @kozlice
    Пробуем. Все замеры на таблице с 5000 записей, рандомным cid от 1 до 10, id primary, на cid индекс.

    На PostgreSQL можно запрашивать
    SELECT a.*
    FROM somedata AS a
    WHERE a.id IN (
    	SELECT b.id
    	FROM somedata AS b
    	WHERE b.cid = a.cid
    	ORDER BY b.id DESC
    	LIMIT 5
    )
    ORDER BY a.cid DESC, a.id DESC

    Но запрос медленный (0.125 сек), и время выполнения растёт прямо пропорционально кол-ву записей и категорий. MySQL вообще не поддерживает LIMIT во вложенных запросах, идём дальше. Мастерим страшного монстра:
    SELECT a.*
    FROM somedata AS a
    WHERE a.id IN (
    	SELECT id
    	FROM somedata AS b
    	WHERE b.cid = a.cid AND (SELECT COUNT(*) FROM somedata AS c WHERE c.id >= b.id AND c.cid = b.cid) <= 5
    )
    ORDER BY a.cid DESC, a.id DESC

    Он, конечно, справился, получены верные данные, но выполнение такого запроса заняло… 15.87 сек. Не хотеть, правда? :)

    Самым производительным оказалось эстетически уродливое уродливое решение. Склеиваем в PHP запросы для каждой категории в единый с помощью UNION:
    (SELECT * FROM somedata WHERE cid = 1 ORDER BY id DESC LIMIT 5)
    UNION
    (SELECT * FROM somedata WHERE cid = 2 ORDER BY id DESC LIMIT 5)
    UNION
    (SELECT * FROM somedata WHERE cid = 3 ORDER BY id DESC LIMIT 5)

    и т.д. до cid = 10, и о чудо: запрос выполняется на MySQL за 0.002 сек, выдавая нужный результат.

    Хотя, возможно я упустил какое-то очевидное решение с приемлемой производительностью. Если найдёте – расскажите нам :)
    Ответ написан
    3 комментария