Новости Joomla

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

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
borro, попробуйте. пишу на коленке, поэтому может где-то синтаксис не сойдется, поправьте.

Код: php
$db = JFactory::getDbo();
$query = 'SELECT file_title,file_url,published,virtuemart_media_id
FROM `ytgb1_virtuemart_medias`
WHERE file_type="product"';
$db->setQuery($query);
$rows = $db->loadObjectList();
$query = 'SELECT virtuemart_media_id
FROM `ytgb1_virtuemart_product_medias`';
$db->setQuery($query);
$ids = $db->loadObjectList('virtuemart_media_id');
echo microtime(true). '<br />';
foreach ($rows as $k=>$v) {
if (isset($ids[$v->virtuemart_media_id])) {
unset($rows[$k]);
}
}
echo microtime(true). '<br />';
print_r($rows);
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
borro, попробуйте вариант от dmitry_stas и отпишитесь, раз
хорошо
вот содержимое mysql-slow.log:
Спойлер
[свернуть]
Филипп, ваш файл с настройками не разбит на секции c [] Это нормально?
Дампы прилагаю
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
я ошибся :) до секунды там далеко :)
старт 1500039943.7579, финиш 1500039943.7904
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Филипп, ваш файл с настройками не разбит на секции c [] Это нормально?

Это конфиг демона mysqld.
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
я ошибся :) до секунды там далеко :)
старт 1500039943.7579, финиш 1500039943.7904
получается никакого AJAX не надо? И так будет практически на любом даже слабом хостинге?
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
вы у себя попробовали?
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Ну сделал я запрос у себя:

Код: sql
SELECT 
  `file_title`,
  `file_url`,
  `published`,
  `virtuemart_media_id`
FROM ytgb1_virtuemart_medias AS m
LEFT JOIN ytgb1_virtuemart_product_medias AS pm USING(virtuemart_media_id)
WHERE pm.virtuemart_media_id IS NULL
AND m.file_type = 'product'

Согласно phpMyAdmin, запрос занял 0.7512 сек. Ищите проблему в настройках сервера. Может быть Вам банально не хватает оперативки или процессорной мощности.
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
получается никакого AJAX не надо? И так будет практически на любом даже слабом хостинге?
А вы возьмите любой хостинг, чейчас многие дают несколько бесплатных дней для тестов, создайте базу, перенесите туда записи из базы нормального магазина с порядка 25-50 тыс товаров, и запустите. Увидите всю прелесть ваших суждений.

Либо второй момент - пользователи не любят ждать... А когда бежит полоска, это их заставляет ждать, информируя, что процесс выполняется, работа идет...

Я больше не буду вас убеждать в выборе направления, в котором нужно работать. Думаю, со временем вы придете к этому сами. Когда при таскании ящиков по 100 кг с 2к яиц ж***па бомбанет, тогда и появятся нужные мысли. ;)
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
вы у себя попробовали?
пытаюсь, но я пока не могу понять, куда вставить ваш код, я начинающий в деле разработки расширений.
в контроллере вида у меня такое:
Код: php
...
class Vm3delpicsControllerDBDelete extends JControllerAdmin{

protected $view_list = 'dbdelete';//вид, который будет загружаться после удаления фотографии(й)

public function getModel($name='DBDelete', $prefix='Vm3delpicsModel', $config=array()){//$name - имя модели
return parent::getModel($name, $prefix, $config);
}
...
а в модели вида такое:
Код: sql
...
class Vm3delpicsModelDBDelete extends JModelList {

protected function getListQuery(){
$db = JFactory::getDbo();
$query = $db->getQuery(TRUE);
$query->select('file_title,file_url,published,m.virtuemart_media_id');
$query->from('#__virtuemart_medias m LEFT JOIN #__virtuemart_product_medias pm ON pm.virtuemart_media_id = m.virtuemart_media_id');
$query->where('m.file_type = \'product\' AND pm.virtuemart_media_id IS NULL');
return $query;
}
...
может мне ваш код написать в view.html.php вида?
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
в phpMyAdmin то с результатами возвращается надпись о том, что запрос выполнялся 8 секунд. Тем не менее по часам - все полторы минуты.

Либо это баг подсчёта времени запроса в phpMyAdmin, либо phpMyAdmin кроме того, что делает запрос, сериализует полученные данные, которые затем передаются аяксом на браузер, где они десериализуются. Поэтому сам запрос может выполняться 8 секунд, а PHP крутит выборку в цикле -- оставшиеся 2 минуты. Плюс время на рендеринг браузера.
« Последнее редактирование: 15.07.2017, 19:06:53 от Филипп Сорокин »
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Может быть Вам банально не хватает оперативки или процессорной мощности.
это как проверить?
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
пытаюсь, но я пока не могу понять, куда вставить ваш код
та куда угодно, проверить. хоть в контроллер, хоть во вью, хоть в модель, все равно. хоть в модуль какой нибудь.

Согласно phpMyAdmin, запрос занял 0.7512 сек. Ищите проблему в настройках сервера. Может быть Вам банально не хватает оперативки или процессорной мощности.
ну и кстати да, согласен. попробовал у себя, у меня вообще 0.44 секунды http://prntscr.com/fvodkh. что конечно медленнее чем 2 независимых запроса, потому что просто в данной ситуации без индексов не может быть по другому, но гораздо быстрее чем озвученное ранее время (минута или сколько там было). поэтому проблема явно в сервере присутствует.

и еще хочу обратить внимание, что такая ситуация с 2-мя запросами выигрывает только когда не используются индексы. не нашел сходу ссылки, но по памяти MySQL принимает решение не использовать индексы если количество строк в выборке будет больше или равно примерно 30% от общего количества строк. поэтому тут надо принимать решение в каждом конкретном случае, что будет выгоднее. но конечно если говорить о порядке выполнения пусть даже 0.75 секунды - то в принципе имхо голову ломать не стоит. насколько я понимаю, это разовая операция, которая будет выполнятся по желанию админа в админке? если так, то плюс минус доли секунды - роли по-моему не играет.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
медленнее чем 2 независимых запроса, потому что просто в данной ситуации без индексов не может быть по другому
ОК, сейчас проверю
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
это как проверить?

Логи нагрузки на сервере обычно показывают расклад.
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Поместил в display view.html.php
Результат:
1500043630.7545
1500043630.797
В первый раз колесико долго крутилось. Второй раз видимо выдача была произведена из кэша, практически сразу.
А зачем замерять между началом и окончанием удаления лишних строк из массива? Для пользователя критично общее время от нажатия на кнопку "Отобразить все файлы", что можно удалить, до их отображения на экране.
В общем я запутался. Такое ощущение что в первый раз данные долго отображались. Это действительно может привести к зависанию на слабом хостинге похоже... Каким путём двинуться? Видимо через AJAX?
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
у меня на ПК c Win 64 бит около 60 сек в phpMyAdmin занял этот запрос.

Showing rows 0 - 24 (130 total, Query took 60.2376 seconds.)
SELECT `file_title`, `file_url`, `published`, `virtuemart_media_id` FROM ytgb1_virtuemart_medias AS m LEFT JOIN ytgb1_virtuemart_product_medias AS pm USING(virtuemart_media_id) WHERE pm.virtuemart_media_id IS NULL AND m.file_type = 'product'

Интересно, что если условие is null заменить на is not null то

Showing rows 0 - 24 (23154 total, Query took 0.0018 seconds.)
SELECT `file_title`, `file_url`, `published`, `virtuemart_media_id` FROM ytgb1_virtuemart_medias AS m LEFT JOIN ytgb1_virtuemart_product_medias AS pm USING(virtuemart_media_id) WHERE pm.virtuemart_media_id IS NOT NULL AND m.file_type = 'product'

pm.virtuemart_media_id согласно структуре таблицы не null. может MySQL в моей версии и в версии ТС "спотыкается" на проверке этого поля на null?

--
-- Table structure for table `ytgb1_virtuemart_product_medias`
--

CREATE TABLE `ytgb1_virtuemart_product_medias` (
  `id` int(1) UNSIGNED NOT NULL,
  `virtuemart_product_id` int(1) UNSIGNED NOT NULL DEFAULT '0',
  `virtuemart_media_id` int(1) UNSIGNED NOT NULL DEFAULT '0',
  `ordering` int(1) NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Database server

    Server: localhost via TCP/IP
    Server type: MySQL
    Server version: 5.7.10 - MySQL Community Server (GPL)
    Protocol version: 10
    User: root@localhost
    Server charset: UTF-8 Unicode (utf8)

Web server

    Apache/2.4.18 (Win64) PHP/5.6.17
    Database client version: libmysql - mysqlnd 5.0.11-dev - 20120503 - $Id: 3c688b6bbc30d36af3ac34fdd4b7b5b787fe5555 $
    PHP extension: mysqliDocumentation curlDocumentation mbstringDocumentation
    PHP version: 5.6.17

« Последнее редактирование: 14.07.2017, 18:03:31 от capricorn »
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Логи нагрузки на сервере обычно показывают расклад.
их где искать, по какому пути?
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
А зачем замерять между началом и окончанием удаления лишних строк из массива?
ой, да, извиняюсь. говорю ж, на коленке писал. тут неправильно, первый замер надо переместить до первого запроса. но у себя проверял правильно, старт и финиш именно.

у меня на ПК c Win 64 бит около 60 сек в phpMyAdmin занял этот запрос.
неее :) на win не надо тестировать скорость :) надеюсь ТС делает это не на windows :)
« Последнее редактирование: 14.07.2017, 18:10:13 от dmitry_stas »
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
ОК, сейчас проверю

Проверил. 2 запроса без индексов действительно быстрее. Однако после того, как я добавил индексы:

Код: sql
ALTER TABLE `ytgb1_virtuemart_product_medias` ADD INDEX `idx_vm_product_medias_media_id` (`virtuemart_media_id`);
ALTER TABLE `ytgb1_virtuemart_medias` ADD INDEX `idx_vm_medias_media_id` (`virtuemart_media_id`);

Запрос с JOIN стал в 3 раза быстрее двух независимых запросов.
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
их где искать, по какому пути?

Попробуйте добавить индексы (см. сообщение выше), затем очистите кэш:

Код
RESET QUERY CACHE;

И попробуйте снова выполнить запрос с LEFT JOIN. Логи нагрузки обычно находятся в личном кабинете, VM Manager, например.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
после того, как я добавил индексы:
Запрос с JOIN стал в 3 раза быстрее двух независимых запросов.
так и есть, все правильно. просто MySQL так работает, оптимизация под это заточена. кстати встречал где-то в обсуждениях, что на Марии именно этот момент примерно в 2 раза прирост скорости дает, по другому оптимизацию безиндексовых запросов переделали.

ТС, по AJAX выше спрашивали - мое мнение, что с учетом последних так сказать достижений по скорости, нет смысла в использовании AJAX и делении на подзапросы. ну пусть даже 10 секунд будет запрос, все равно сопутствующие затраты на AJAX будут больше.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
ТС, по AJAX выше спрашивали - мое мнение, что с учетом последних так сказать достижений по скорости, нет смысла в использовании AJAX и делении на подзапросы. ну пусть даже 10 секунд будет запрос, все равно сопутствующие затраты на AJAX будут больше.

Согласен. Лучше и эффективнее добавить индексы.
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Действительно, улучшилось даже на Windows. Было 60 сек, стало 0,02.

Showing rows 0 - 24 (130 total, Query took 0.0161 seconds.)
SELECT `file_title`, `file_url`, `published`, `virtuemart_media_id` FROM ytgb1_virtuemart_medias AS m LEFT JOIN ytgb1_virtuemart_product_medias AS pm USING(virtuemart_media_id) WHERE pm.virtuemart_media_id IS NULL AND m.file_type = 'product'.


*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
Было 60 сек
Чешу репу и удивляюсь, откуда такие тормоза. Наверное, дело в версии MySQL. Я пользуюсь MariaDB последней версии.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
поля проиндексированы.
переделываю на вариант с left join, протестирую...
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
я имел в виду, что индексы есть "из коробки". есть индекс primary на поле virtuemart_media_id в таблице vm_medias и составной индекс на virtuemart_product_id и virtuemart_media_id для vm_product_medias. Видимо надо было создать 1 дополнительный индекс чисто на virtuemart_media_id для vm_product_medias. Правильно?
И добавить в архив компонента запрос по созданию индекса на таблицу. Проблем же с правами не будет на это?

Сейчас главный затык получается в чем-то кроме БД. И это надо попытаться как-то изменить. Ищу логи нагрузки на сервер. Хотя, с другой стороны, я же не смогу перенастроить сервер какому-то другому пользователю компонента. Получается, наверняка найдутся такие же медленные серверы как у меня. И получается этот компонент у них приведет к белому экрану. Получается я делаю компонент лишь для ограниченного числа счастливчиков?.. И AJAX, как писал dmitry_stas, лишь усугубит ситуацию накладными расходами. Где же выход из тоннеля?
« Последнее редактирование: 15.07.2017, 11:14:33 от borro »
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
Видимо надо было создать 1 дополнительный индекс чисто на virtuemart_media_id для vm_product_medias. Правильно?
И добавить в архив компонента запрос по созданию индекса на таблицу. Проблем же с правами не будет на это?

Когда Joomla! устанавливается на сервак, она создаёт кучу индексов, так что никаких проблем не будет. Не обязательно, но желательно перед установкой индекса проверить, не создал ли пользователь его вручную. Это делается тоже простым запросом.

Цитировать
Видимо надо было создать 1 дополнительный индекс чисто на virtuemart_media_id для vm_product_medias. Правильно?

Выходит, что так.

А 2 запроса оказались быстрее JOIN, кстати, потому что поле file_type проиндексировано уже, и по нему нет перебора. Так бы, если бы и на file_type индекс отсутствовал, то можно было бы вообще повеситься :)
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
А 2 запроса оказались быстрее JOIN, кстати, потому что поле file_type проиндексировано уже, и по нему нет перебора. Так бы, если бы и на file_type индекс отсутствовал, то можно было бы вообще повеситься :)
неа. удалите индекс, увидите что ничего не поменяется. как я писал, MySQL не использует индексы если количество строк в выборке будет больше примерно 30% от общего количества строк в таблице. поэтому в данном случае индекс file_type не работает в принципе, всегда используется полный скан таблицы.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
неа. удалите индекс, увидите что ничего не поменяется. как я писал, MySQL не использует индексы если количество строк в выборке будет больше примерно 30% от общего количества строк в таблице. поэтому в данном случае индекс file_type не работает в принципе, всегда используется полный скан таблицы.

Уже не могу проверить, удалил таблички. Количество строк в выборке может быть меньше 30%, и тогда индексы используются. Короче говоря, это всё условно и с большой натяжкой.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Количество строк в выборке может быть меньше 30%, и тогда индексы используются. Короче говоря, это всё условно и с большой натяжкой.
да, конечно. я ж поэтому и говорю, что это речь о данном конкретном случае. так то само собой, индексы по-прежнему нужны, важны, и актуальны :)
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться