Новости Joomla

Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях

Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях

👩‍💻 Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях. На старте его сайт на Joomla 3 вообще не смог обновиться на Joomla 5. Пришлось делать экспорт/импорт материалов. Проделав всё это он запустил-таки этот объём данных на Joomla 5. Тестовый скрипт грузил 200 материалов из этого объёма всего за 94 секунды ))) А главная страница с категориями грузилась 20 секунд. Добавив индекс для таблицы #__content

CREATE INDEX idx_catid_state ON #__content (catid, state);
он сократил время загрузки категорий до 1 секунды. Затем наш герой решил поковырять SQL-запрос в ArticleModel, который отвечает за выборку материалов. И решил заменить тип JOIN на STRAIGHT_JOIN для категорий.
// ->from($db->quoteName('#__content', 'a'))->from(    $db->quoteName('#__content', 'a')    . ' STRAIGHT_JOIN ' . $db->quoteName('#__categories', 'c')    . ' ON ' . $db->quoteName('c.id') . ' = ' . $db->quoteName('a.catid'))// ->join('LEFT', $db->quoteName('#__categories', 'c'), $db->quoteName('c.id') . ' = ' . $db->quoteName('a.catid'))
Что сократило загрузку 200 материалов из 150к с 94 секунд до 5. К слову сказать, боевой сайт на Joomla 3 крутится на 12CPU 64GB рамы. А все манипуляции с кодом он делает на базовом 1CPU 1GB сервере и замеры скорости даны именно для базового сервера. Но это всё в дискуссии, хотя в идеале должно вылиться в Pull Requests. Мы - Open Source сообщество, где никто никому ничего не должен. Джунгли. Но человек ищет пути оптимизации Joomla и предлагает решения. Если оказать поддержку и предложить помощь хотя бы с тестированием самых разнообразных сценариев, то возможно эти улучшения смогут войти в ядро. Пусть не быстро, пусть через несколько лет, пусть не все, но войдут. Достаточно предложить руку помощи и приложить немного усилий.
Дискуссию на GitHub можно почитать здесь.@joomlafeed#joomla #community #php

0 Пользователей и 1 Гость просматривают эту тему.
  • 45 Ответов
  • 13180 Просмотров
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Народ подскажите, как отправить такую конструкцию $db->setQuery()? :o
Код: sql
CREATE TEMPORARY TABLE loc ( id INT(11) NOT NULL, loc longtext NOT NULL );
INSERT INTO loc (id, loc) SELECT record_id, field_value FROM jos_js_res_record_values WHERE field_id IN (10,48);
CREATE TEMPORARY TABLE HTML ( id INT(11) NOT NULL, HTML longtext NOT NULL );
INSERT INTO HTML (id, html) SELECT record_id, field_value FROM jos_js_res_record_values WHERE field_id IN (3,33);
CREATE TEMPORARY TABLE img ( id INT(11) NOT NULL, img longtext NOT NULL );
INSERT INTO img (id, img) SELECT record_id, field_value FROM jos_js_res_record_values WHERE field_id IN (47,49);
SELECT r.id, r.title, r.published, r.type_id, rc.catid, loc.loc, html.html, img.img FROM jos_js_res_record AS r LEFT JOIN jos_js_res_record_category AS rc ON rc.record_id = r.id
LEFT JOIN loc AS loc ON loc.id = r.id
LEFT JOIN HTML as HTML ON html.id = r.id
LEFT JOIN img as img ON img.id = r.id
WHERE r.type_id IN (1,8,10) AND rc.catid IN (2,205,206)
^-^

надо сказать что phpmyadmin съедает все и выдает что надо, а setQuery() спотыкается на ";"  !

вот наткнулся на:
еще есть полезный метод  $database->query_batch(); который позволяет выполнять сразу несколько запросов, разделенных точкой с запятой.
но это для 1.0...
может что-то и для 1.5 есть ?

а попроще я ничего так и не придумал, чтоб вытащить максимум структурированной информации  минимальным количеством запросов :) можете предложить свои варианты, буду тоже признателен
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #1 : 30.03.2010, 22:51:32 »
Ну а поискать самому? Неужели так сложно потратить 5 минут и найти ответ самому? В Joomla 1.5 вместо метода query_batch есть метод queryBatch. Так что ничего особенно не поменялось с тех пор. Вот только на количестве запросов это никак не скажется - все эти запросы будут разбиты по разделителю (;) и выполнены последовательно. Количество строк кода - да, сэкономите, а по количеству запросов - меньше чем их есть не будет.
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #2 : 31.03.2010, 10:47:41 »
Огромное спасибо, видимо плохо искал, буду пробовать

а про количество запросов я имел ввиду, что может есть вариант попроще сделать то, что делают перечисленные запросы, уложиться в 3 или в 1 запрос, но это скорей вопрос на форум по mysql ) Я и так сократил их количество в разы (а то и в сотни раз)
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #3 : 31.03.2010, 18:55:18 »
вроде заработало, только несколько сразу через ";" не прокатило все равно
пришлось каждую строку по очереди отправлять в setQuery, потом после нее использовать queryBatch
информации крайне мало и та на английском, так что я так и не понял так ли сделал или руки у меня не оттуда растут :)
но не очень красиво )

Код: php
        $db = &JFactory::getDBO();

        $query = 'CREATE TEMPORARY TABLE loc ( id INT(11) NOT NULL, loc longtext NOT NULL ); ';
$db->setQuery($query);
$db->queryBatch();
$query = ' INSERT INTO loc (id, loc) SELECT record_id, field_value FROM jos_js_res_record_values WHERE field_id IN (10,48);';
$db->setQuery($query);
$db->queryBatch();
$query = 'CREATE TEMPORARY TABLE HTML ( id INT(11) NOT NULL, HTML longtext NOT NULL );';
$db->setQuery($query);
$db->queryBatch();
$query = 'INSERT INTO HTML (id, html) SELECT record_id, field_value FROM jos_js_res_record_values WHERE field_id = 3;';
$db->setQuery($query);
$db->queryBatch();
$query = 'CREATE TEMPORARY TABLE img ( id INT(11) NOT NULL, img longtext NOT NULL );';
$db->setQuery($query);
$db->queryBatch();
$query = 'INSERT INTO img (id, img) SELECT record_id, field_value FROM jos_js_res_record_values WHERE field_id = 47;';
$db->setQuery($query);
$db->queryBatch();
$query = 'SELECT r.id, r.title, r.published, r.type_id, rc.catid, loc.loc, html.html, img.img FROM jos_js_res_record AS r
LEFT JOIN jos_js_res_record_category AS rc ON rc.record_id = r.id
LEFT JOIN loc AS loc ON loc.id = r.id
LEFT JOIN HTML as HTML ON html.id = r.id
LEFT JOIN img as img ON img.id = r.id
WHERE r.type_id IN (1,8,10) AND rc.catid IN (2,205,206)';
$db->setQuery($query);
       
$items = $db->loadObjectList();
return $items;
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #4 : 31.03.2010, 19:30:49 »
Хм, а зачем для одиночных запросов queryBatch? Для одиночных просто query используй... Или же один вызов queryBatch для целой пачки запросов, разделенных ;.
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #5 : 31.03.2010, 20:42:20 »
а я так и ниасилил как он работает ) и примеров найти не могу...
переменную с запросом он не умеет принимать, куда ж ее тогда отправлять ?
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #6 : 31.03.2010, 21:31:11 »
вот те рабочий пример

$sql = '
   SET @upd_counter=0;
   UPDATE '.$this->getTableName().' SET `'.$ordering.'`=(@upd_counter:=@upd_counter+2)';
$db->setQuery($sql);
         
$res = $db->queryBatch();
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #7 : 31.03.2010, 22:41:28 »
спасибо ), а дальше, чем возвращать выбранное из базы ?
$db->queryBatch() = "bool(true) } function uninitialize()   { GUnload(); }" , я так понял возвращается или true или false
а если добавить $db->loadObjectList(); выдает ошибку mysql, я похоже вообще ниче понять не могу

раз уж на то пошло, поправьте, плз
Код: php
function getItems($params, $cids)
    {
 $db = &JFactory::getDBO();
$query = 'xxxxxxxxxx';
$db->setQuery($query);
$db->queryBatch();
$items = $db->loadObjectList();
return $items;
   }
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #8 : 31.03.2010, 22:47:46 »
мы слепые или как?

$res = $db->queryBatch();
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #9 : 31.03.2010, 22:53:31 »
хм,
Код: php
function getItems($params, $cids)
    {
 $db = &JFactory::getDBO();
$query = 'xxxxxxxxxx';
$db->setQuery($query);
$items = $db->queryBatch();
return $items;
   }

запрос проходит, но вместо $items-ов получаю
bool(true) } function uninitialize()   { GUnload(); }
« Последнее редактирование: 31.03.2010, 23:08:54 от softman_xp »
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #10 : 31.03.2010, 23:26:16 »
смотря какой запрос
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #11 : 31.03.2010, 23:28:28 »
запрос в 1м посте
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #12 : 31.03.2010, 23:30:02 »
все или последний? или как?
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #13 : 31.03.2010, 23:32:13 »
все надо отправить разом и получить на выходе список объектов, как от $db->loadObjectList();
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #14 : 31.03.2010, 23:38:24 »
queryBatch не возвращает данные, а только результат успешно/не успешно
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #15 : 31.03.2010, 23:54:04 »
это я уж понял, и возвращает он в моем случае true, что говорит об успехе мероприятия
но при попытке вытащить данные с помощью $items = $db->loadObjectList(); получаю 500 - JDatabaseMySQL::query: 1064
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #16 : 01.04.2010, 00:07:41 »
ну есессно
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #17 : 01.04.2010, 00:17:00 »
ну и ни одна из возвращающих функций не работает
тока getNumRows
или я что-то не понимаю !
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #18 : 01.04.2010, 00:19:40 »
ну и ни одна из возвращающих функций не работает
и не будет.
того, что тебе надо, в Joomla нету
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #19 : 01.04.2010, 08:44:09 »
утро, вечера мудреннее! мы походу на разных языках разговариваем, но все равно спасибо )))
ну как же не будет, когда
Код: php
function getItems($params, $cids)
    {
 $db = &JFactory::getDBO();
$query = 'много запросов подряд';
$db->setQuery($query);
$items = $db->queryBatch();
$query = 'результирующий запрос SELECT ххх';
$db->setQuery($query);
$items = $db->loadObjectList();
return $items;
   }
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #20 : 01.04.2010, 12:21:04 »
я не знаю, как работает "CREATE TEMPORARY TABLE"
честно говоря, для меня вообще непонятна данная конструкция запросов SQL
по мне - так бред полный.
если я правильно понимаю, поставленную задачу, то делать надо было бы совершенно по другому
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #21 : 01.04.2010, 14:59:39 »
да ? ну можешь предложить свой вариант :)
а задача состоит в том, чтобы из таблицы, где данные размещены в одном столбце, распределить по разным
разработчики компонента (Joomsuite Resource) в своих модулях делают так(грубо говоря): сначала извлекают из основной таблицы записи, а потом для каждой записи циклом формируется запрос, которым извлекаются дополнительные параметры (которые я и хочу прицепить к одной выборке). Получается если записей несколько тыщ, этож сколько будет запросов... И разбиение по страницам тут не прокатит, ибо мне нужны все записи для наложения на карту. Вот так,вкратце )
Основная таблица:
|id|title|category|
|1|test1|2|
Таблица с доп параметрами
|record_id (id записи из оновной таблицы)|какое-то значение|тип значения|
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #22 : 01.04.2010, 15:40:21 »
оптимизация это уже за отдельную плату :)
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #23 : 01.04.2010, 16:33:04 »
ну и молчал бы тогда )))
а я наверное месяц ковырялся пока придумал такой вариант, решил что mysql по-другом не умеет ) и так вместо 200 (штатного модуля) получилось 5 запросов !
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #24 : 01.04.2010, 16:57:01 »
т.е., при вызове модуля (т.е., на каждой странице, при каждом запросе) у тебя MySQL будет вынужден создавать в памяти ТРИ временных таблицы, заполнять их, потом делать по ним выборку................
прикольно
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #25 : 01.04.2010, 19:56:52 »
во-первых не на каждой странице, он будет использоваться как альтернатива блога и запускаться на пустой странице по вызову из меню (ни и на главной)
во-вторых это лучше чем 1 запрос + еще один запрос для каждой единицы контента (которых в перспективе будет несколько тысяч)
вероятно есть и более простой вариант, но я пока ничего не придумал и не нашел :)
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
*

atlantech

  • Осваиваюсь на форуме
  • 12
  • 1 / 0
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #26 : 13.04.2010, 15:47:33 »
Раз уж ты знаешь,  что у тебя всего три типа таких параметров, то это дело можно оформить одним запросом. делал такое в Firebird стотыщпицот раз, думаю и в мускуле проканает. Алгоритм такой : три раза джоинишь к основной таблице дополнительную с альясами, а потом весь запрос группируешь по всем полям главной таблицы а из каждого джоина второй таблицы берёшь одно поле и заворачиваешь его в агрегатную функцию, например в max. Надеюсь понятно изложил, с примером заморачиваться в падляк, но уж если сильно надо будет напишу ;)
*

userxp

  • Живу я здесь
  • 2019
  • 403 / 6
  • Злой и ужасный бармалей
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #27 : 13.04.2010, 16:01:04 »
2 softman_xp: вот никогда не делай таких глупостей, как написано выше ;D
Как правильно задавать вопрос службе технической поддержки  yes!
SGA CM 7.2.0 RC0 KANG Build GWK74 + s95allinonescript + CWM 5.0.2.6 + Modem XWKT3
*

atlantech

  • Осваиваюсь на форуме
  • 12
  • 1 / 0
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #28 : 13.04.2010, 22:12:57 »
2 softman_xp: вот никогда не делай таких глупостей, как написано выше ;D
Обоснуйте в чём глупость?
*

softman_xp

  • Захожу иногда
  • 318
  • 32 / 0
  • Разработка для Joomla
Re: Несколько запросов в $db->setQuery. Как ?
« Ответ #29 : 13.04.2010, 23:45:31 »
2 atlantech: не совсем понял... мне ж из дополнительной таблицы нужно поля выбрать по определенному условию. WHERE в одном запросе 4 раза не прокатит...

2 userxp: я пока решил оставить вариант с 3-мя временными таблицами, подожду пока выйдет новая версия компонента, разработчики обещают увеличение производительности до 70%, думаю у них и подсмотрю потом гениальный запрос :)
... в принципе можешь предложить свой вариант, за вознаграждение, предложение в личку )
Компоненты/модули/плагины для Joomla
(skype: navipoint)(mail: softman(собака)inbox(точка)ru)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Оптимизировать кол-во запросов

Автор Mick_20

Ответов: 21
Просмотров: 1433
Последний ответ 27.01.2014, 19:16:20
от Mick_20