Новости Joomla

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

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
А дальше, зная это время, можете рассчитать примерно, сколько запросов выполнится в течении 1 сек, либо сколько строк лучше брать из базы, что бы уложиться в период менее 1 сек
Спасибо, кажется чуть просветлело в голове :) А зачем в 1 сек? Вы же говорили, что среднестатистически хостинги 30 секунд могут выполнять скрипт
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
Перепишу свой пост, т.к. писал, когда ответа небыло.

Смотрите, Вы выбрали не все записи из базы, а только одну, запрос занял доли секунды. Теперь ваша задача - определить, сколько запросов можно выполнить за 1 секунду. Запрос занял 0.0688 сек, следовательно 1/0.0688=14 запросов. Теперь вы можете написать цикл, в котором выполняется один запрос и производятся действия с файлами. Перед циклом ставим счетчик времени выполнения и внутри - проверку, успеет ли выполниться следующая интерация цикла до завершения 1 сек, т.к. потом придет вызов из JS (кстати, эту ситуацию тоже нужно проверять).

1 сек. взял от балды, т.к. вам нужно, что бы прогресс-бар двигался. Можно и 2 сек поставить, и 5. То есть у вас JS сделал запрос - отрисовал график, сделал запрос - отрисовал график. Запрос идет порциями, скажем, по 7-10 интераций цикла с учетом времени на отработку удаления файла и запись лога.

Все, рабочий день закончился, убегаю домой ))
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

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

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Всем доброго утра! Продолжаю:скриншот прикладываю. Пошел читать, что это означает :)

Почитал, пока мало что понял :)

Тяжело серверу склеивать 20 тыс. записей. Вроде, ключи имеются, индексы тоже. Ждём ответа Фёдора :)

А пока не хотите ещё раз "рискнуть"? Было бы интересно узнать, сколько будет выполняться это:

Код: sql
SELECT 
  `file_title`,
  `file_url`,
  `published`,
  `virtuemart_media_id`
FROM `#__virtuemart_medias`
WHERE `file_type` = 'product'
AND `virtuemart_media_id` NOT IN (SELECT `virtuemart_media_id` FROM `#__virtuemart_product_medias`)

Кстати, вы говорили, что проиндексировали поля. Какие именно?

*

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

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
И ещё попробуйте прописать такой конфиг для MYSQLD (старый удалите/сохраните в текстовом файле). Если оперативки гига 2 имеется (а кстати, сколько у Вас её?), то должен подойти.

Код
character-set-server = utf8 
collation-server = utf8_general_ci
character_set_server = utf8
collation_server = utf8_general_ci
init-connect = 'SET NAMES utf8'

key_buffer_size = 500M

innodb_buffer_pool_size = 1500M
innodb_log_file_size = 64M
innodb_log_buffer_size = 4M
innodb_flush_log_at_trx_commit = 0
innodb_thread_concurrency = 8
innodb_flush_method = O_DIRECT
innodb_file_per_table

table_cache=1024

query_cache_type = 1
query_cache_limit = 1M
query_cache_min_res_unit = 2k
query_cache_size = 80M
« Последнее редактирование: 13.07.2017, 19:39:39 от Филипп Сорокин »
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Было бы интересно узнать, сколько будет выполняться это:
Код: sql
SELECT 
  `file_title`,
  `file_url`,
  `published`,
  `virtuemart_media_id`
FROM `#__virtuemart_medias`
WHERE `file_type` = 'product'
AND `virtuemart_media_id` NOT IN (SELECT `virtuemart_media_id` FROM `#__virtuemart_product_medias`)
Доброе утро! Спасибо. Быстрее - 7.1954 сек, может надо несколько раз запустить для статистически верного результата. Ответ конечно на экране все равно через 1,5 минуты
Индексы те, которые были, других не добавлял. Прикладываю
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Если оперативки гига 2 имеется (а кстати, сколько у Вас её?)
Цитировать
root@server:~# free
             total       used       free     shared    buffers     cached
Mem:       1048576     592860     455716          0          0     129332
-/+ buffers/cache:     463528     585048
Swap:       524288      49180     475108
похоже, что не для этого VPS
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
1 сек. взял от балды, т.к. вам нужно, что бы прогресс-бар двигался. Можно и 2 сек поставить, и 5.
Дело в том, чтобы отрисовывать прогресс бар, надо сначала знать, сколько строк всего вернётся. При такой тяжести получения ответа на вышеприведенный sql-запрос предварительно запрашивать, сколько всего записей вернётся, станет удручающей ситуацией для пользователя. Сначала 1,5 минуты ожидает ответа о том, сколько всего, а потом каждые 90сек/130шт секунд он будет получать данные по новому файлу, которые он потом будет галочками отмечать на удаление. Итого 1,5+1,5=3 минуты... Наверно от бара придется отказаться.

Вопрос. Как все полученные строки представить в формате с пагинацией и устроить навигацию без перезагрузки страницы? Или без разницы для браузера, можно все тысячу, к примеру, строк пустить вертикально вниз и он не зависнет?

Еще вопрос. Как можно через какие-то переменные среды или phpinfo() узнать заранее, сколько есть время до бана со стороны хостинга(до возникновения белого экрана), чтобы потом высчитывать какое-то время с запасом прочности, в течении которого обращаться к базе в php скрипте?
« Последнее редактирование: 14.07.2017, 10:45:35 от borro »
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Погуглите SQL_CALC_FOUND_ROWS и не надо будет отдельно запрашивать кол-во строк.
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
Дело в том, чтобы отрисовывать прогресс бар, надо сначала знать, сколько строк всего вернётся. При такой тяжести получения ответа на вышеприведенный sql-запрос предварительно запрашивать, сколько всего записей вернётся, станет удручающей ситуацией для пользователя. Сначала 1,5 минуты ожидает ответа о том, сколько всего, а потом каждые 90сек/130шт секунд он будет получать данные по новому файлу, которые он потом будет галочками отмечать на удаление. Итого 1,5+1,5=3 минуты... Наверно от бара придется отказаться.

Вопрос. Как все полученные строки представить в формате с пагинацией и устроить навигацию без перезагрузки страницы? Или без разницы для браузера, можно все тысячу, к примеру, строк пустить вертикально вниз и он не зависнет?

Приведу пример на яйцах. Куриных. Итак, у вас стоит контейнер. В нем ящики с яйцами. Каждый ящик содержит примерно по 2000 куриных яиц. Вам поставлена задача проверить все яйца в контейнере на предмет их испорченности, для чего яйцо нужно поместить в специальный прибор с лампой и посмотреть его на просвет. Каким образом вы будете решать задачу?

Вы вынимаете из контейнера ящик, ставите на стол и начинаете в нем ковыряться. Надеюсь, вы не повредите прямую кишку этим действом, т.к. известно, что одно яйцо от курочки весит в среднем 50 грамм. Следовательно, ящик будет весить 2000*0,05=100 килограмм. Допустим, каким то чудом вам удалось этот ящик вытащить из контейнера. Теперь вы начинаете перебирать в нем яйца.

Но есть второй алгоритм. Вместо того, что бы рвать грыжу и ж**пу, мы вообще ящик не трогаем. Мы вначале читаем номенклатуру, где написано, что в каждом ящике по 2к яиц. Зная вес яйца оцениваем вес ящика и понимаем, что нам его не поднять, поэтому и не трогаем. Мы решаем сделать по другому - запускаем в него руку, рука взяла два яйца, во вторую руку одно яйцо. Проверяем в аппарате, ложим в другой ящик. Засекаем время на эту операцию и видим, что мы можем проверять три яйца со скоростью 20 секунд. Итого на 1 яйцо тратим 20/3=6.67 секунд. Мы вычисляем, что весь ящик перелопатим за 2000/6.67=299.85 секунд, или 5 минут. Прибавим к этому времени погрешность, например, отвлекся пришлепнуть комара или яйцо зачесалось (свое), прибавим минуту. Итого мы лопатим ящик с 2к яиц за 6 минут.

Контейнер – база данных. Ящики – таблицы в ней. Яйца – записи. Вы пытаетесь вытащить неподъемный ящик из контейнера, зачем? Берите по 1 яйцу (по одной записи) и проверяйте. Полученные 6 минут в примере – это ваше значение 100% для прогресс-бара.
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
Другими словами вам не нужен такой неподъемный запрос, который не каждый хостинг даст выполнить (с учетом ограничения времени выполнения скрипта). Пишите код так, что бы он работал везде. Для этого запросите у базы общее количество строк, которые предстоит перелопатить, выполните первый запрос, определите время, затрачиваемое на операцию. Создайте цикл, в котором от базы получаем пачку записей (в примере три яйца) и в том же цикле эти записи сразу проверяем (удаляем файлы). А перезапускает этот цикл JS, который получает и затем передает при запуске в php-скрипт текущее состояние, например, последний ID строки. И такой код будет работать везде, на любом хостинге.
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Спасибо за огонёк :)
Для этого запросите у базы общее количество строк, которые предстоит перелопатить
Так вот это действие займёт 1,5 минуты, как я понимаю на моём сервере. Похоже Аркадий указал выход. Ладно, надо дойти до реализации, глядишь вопросов меньше станет
« Последнее редактирование: 14.07.2017, 11:32:10 от borro »
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
Так вот это действие займёт 1,5 минуты, как я понимаю на моём сервере.

Код: sql
SELECT COUNT(*) 
FROM `#__virtuemart_medias`
WHERE `file_type` = 'product'
AND `virtuemart_media_id` NOT IN (SELECT `virtuemart_media_id` FROM `#__virtuemart_product_medias`)
А так?

Либо как Аркадий предложил.

Важно понять, что вы запрашиваете количество строк, а не весь массив данных из базы. И дергаете оттуда опять же, не весь массив, а только одну строку. Ибо запрос вида
Код: sql
SELECT 
  `file_title`,
  `file_url`,
  `published`,
  `virtuemart_media_id`
FROM `#__virtuemart_medias`
выдаст вам как раз гигантский массив, объем которого зависит от объема записей, всю выборку. А вам это не нужно. Поэтому вы и работаете с LIMIT и в параметрах указываете, что выбирать не всю базу, а только с Х по У.
« Последнее редактирование: 14.07.2017, 11:53:32 от SeBun »
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Точно не отследил, но результаты запроса с COUNT(*) вернулись не ранее чем через 30 сек. Может, когда это все будет выполняться в скрипте, и не надо будет выводить это на экран, всё будет быстрее, не знаю, надо экспериментировать.
Поэтому вы и работаете с LIMIT и в параметрах указываете, что выбирать не всю базу, а только с Х по У.
причем там же ещё есть фильтр по второй таблице, vm_product_medias. Ладно надо дойти до лопаты. Тут уже возник ещё вопрос: куда обычно в архиве компонента кладется js файл, который будет подключаться в виде и будет запускать AJAX?
« Последнее редактирование: 24.07.2017, 11:40:46 от borro »
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Точно не отследил, но результаты запроса с COUNT(*) вернулись не ранее чем через 30 сек.
С хостингом или настройками сервера у вас явно что-то не так: ваш запрос должен срабатыватъ за доли секунды.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
С хостингом или настройками сервера у вас явно что-то не так: ваш запрос должен срабатыватъ за доли секунды.
Где же взять доктора Айболита? Наверно примерно так и есть, просто phpMyAdmin жадничает выдавать ответ на экран. В реальном php скрипте пока не проверял, как быстро это будет. В ходе реализации наверно проверю
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
А если запрос не в phpMyAdmin делать, а в консоли?
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
А если запрос не в phpMyAdmin делать, а в консоли?
Цитировать
mysql> SELECT COUNT( * )
    -> FROM  `ytgb1_virtuemart_medias`
    -> WHERE  `file_type` =  'product'
    -> AND  `virtuemart_media_id` NOT
    -> IN (
    ->
    -> SELECT  `virtuemart_media_id`
    -> FROM  `ytgb1_virtuemart_product_medias`
    -> );
+------------+
| COUNT( * ) |
+------------+
|        130 |
+------------+
1 row in set (1 min 5.04 sec)
Кстати. Запустил
Код: sql
select `file_title`,`file_url`,`published`,m.virtuemart_media_id
from ytgb1_virtuemart_medias m
left JOIN ytgb1_virtuemart_product_medias pm
ON pm.virtuemart_media_id = m.virtuemart_media_id
where pm.virtuemart_media_id IS NULL
AND file_type = 'product'
в консоли и там совсем не 8 секунд, что выдавал phpMyAdmin, а
Цитировать
130 rows in set (1 min 21.33 sec)
« Последнее редактирование: 14.07.2017, 15:03:33 от borro »
*

robert

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

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Хм, а без JOIN?
в консоли запрос
Код: sql
select `file_title`,`file_url`,`published`,m.virtuemart_media_id
from ytgb1_virtuemart_medias m
where
file_type = 'product'
выдает
Цитировать
22659 rows in set (0.12 sec)
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Так, постойте, мы ведь говорили о запросе с COUNT(), а не с выборкой. Какое время выполнения
Код: sql
SELECT COUNT(*) 
FROM ytgb1_virtuemart_medias m
LEFT JOIN ytgb1_virtuemart_product_medias pm
ON pm.virtuemart_media_id = m.virtuemart_media_id
WHERE pm.virtuemart_media_id IS NULL
AND file_type = 'product'
? С выборкой однозначно нужен LIMIT, об этом уже говорили.
« Последнее редактирование: 14.07.2017, 15:22:26 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Цитировать
mysql> SELECT COUNT(*)
    -> FROM ytgb1_virtuemart_medias m
    -> LEFT JOIN ytgb1_virtuemart_product_medias pm
    -> ON pm.virtuemart_media_id = m.virtuemart_media_id
    -> WHERE pm.virtuemart_media_id IS NULL
    -> AND file_type = 'product';
+----------+
| COUNT(*) |
+----------+
|      130 |
+----------+
1 row in set (1 min 10.44 sec)

*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
у вас количество строк в выборке - почти 100% от общего количества строк в таблице. согласно документации MySQL не будет использовать в таком случае индексы, будет полный скан таблицы. что у вас и происходит. исходя из этого - никаких left join, а тем более вложенных запросов. делайте 2 запроса, первый - выбирайте массив объектов file_type = 'product' из ytgb1_virtuemart_medias, второй - выбирайте массив virtuemart_media_id из ytgb1_virtuemart_product_medias. далее php - пройдитесь в цикле по первому массиву объектов, проверяйте наличие virtuemart_media_id во втором массиве, удаляйте ненужные строки.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

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

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

Какая разница? 2 запроса будут ещё медленнее. Будет такой же перебор записей, полный скан таблицы + накладные расходы соединения/парсинга/подготовки запроса и пр.

Цитировать
похоже, что не для этого VPS
Тогда можете попробовать этот конфиг:

Код
character-set-server = utf8 
collation-server = utf8_general_ci
character_set_server = utf8
collation_server = utf8_general_ci
init-connect = 'SET NAMES utf8'

key_buffer_size = 250M

innodb_buffer_pool_size = 650M
innodb_log_file_size = 64M
innodb_log_buffer_size = 4M
innodb_flush_log_at_trx_commit = 0
innodb_thread_concurrency = 8
innodb_flush_method = O_DIRECT
innodb_file_per_table

table_cache=512

query_cache_type = 1
query_cache_limit = 1M
query_cache_min_res_unit = 2k
query_cache_size = 80M

После изменения не забудьте перезагрузить сервер.
*

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

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Автор, кстати, не дадите мне дамп Ваших табличек (интересует только две, #__virtuemart_medias и #__virtuemart_product_medias) -- я на своём серваке сделаю запрос и отпишусь Вам, если интересно проверить.
*

dmitry_stas

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

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

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
вы сначала попробуйте, а потом рассуждайте. даю 99% что 2 запроса и перебор с проверкой будут менее 1 секунды. только проверка не in_array, это будет медленно, а isset. т.е. второй массив надо выгрузить с ключами = virtuemart_media_id
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
borro, попробуйте вариант от dmitry_stas и отпишитесь, раз
согласно документации MySQL не будет использовать в таком случае индексы
Не будь паразитом, сделай что-нибудь самостоятельно!
*

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

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
вы сначала попробуйте, а потом рассуждайте. даю 99% что 2 запроса и перебор с проверкой будут менее 1 секунды. только проверка не in_array, это будет медленно, а isset. т.е. второй массив надо выгрузить с ключами = virtuemart_media_id
Вся прелесть состоит в том, что вы тем самым лишаете сервер возможности закэшировать этот запрос, то есть очень многое теряете, плюс перебор будет не только на стороне MySQL, но ещё и PHP. Когда Вы делаете зарос по фильтру: file_type = 'product' -- происходит полный скан таблицы.
*

dmitry_stas

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