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

draff

  • Гуру
  • 5803
  • 434 / 7
  • ищу работу
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
А если так:
Код: sql
SELECT 
  `file_title`,
  `file_url`,
  `published`,
  `virtuemart_media_id`
FROM #__virtuemart_medias AS m
LEFT JOIN #__virtuemart_product_medias AS pm USING(virtuemart_media_id)
WHERE pm.virtuemart_media_id IS NULL
HAVING m.file_type = 'product'
на такой запрос говорит, что Unknown column 'm.file_type' in 'having clause'. Хотя file_type присутствует в virtuemart_medias
Настройки из /etc/mysql/my.cnf:
Спойлер
[свернуть]
*

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

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
Филипп, а зачем искать иголку, если время выполнения этого запроса зависит от объема записей в БД и аппаратных ресурсов сервера?
Чисто спортивный интерес.

Цитировать
Не проще реализовать то, что я предлагаю?
В идеале, если бы я разрабатывал что-нибудь для масс, я бы так и сделал.

Но ответ сервера вообще не адекватный.
*

borro

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

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

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
на такой запрос говорит, что Unknown column 'm.file_type' in 'having clause'. Хотя file_type присутствует в virtuemart_medias
Настройки из /etc/mysql/my.cnf:
Спойлер
[свернуть]

Попробуйте без указателя таблицы:

Код
HAVING file_type = 'product'
*

borro

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

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

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Настройки из /etc/mysql/my.cnf:

А самой главной-то директивы для табличек INNODB нету :)

Код
innodb_flush_log_at_trx_commit=0

Не факт, что поможет, но попробуйте добавить её и перезапустить сервер.
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Попробуйте без указателя таблицы:
Код
HAVING file_type = 'product'
Unknown column 'file_type' in 'having clause'
*

draff

  • Гуру
  • 5803
  • 434 / 7
  • ищу работу
переведите, пожалуйста, на мой чайниковый уровень :)
Вот настройки с конфига вашего мускул. Расскоментируйте и рестарт мускул
Код
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2
#log-queries-not-using-indexes
Потом в логе mysql-slow.log  будет весь запрос
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
я про то, что захожу в phpMyAdmin, вставляю запрос, нажимаю выполнить и получаю на экране ответ по выполненному запросу. Запрос возвращает, если сервер в нокдаун не уходит, 130 строк всего с 4 столбцами, вряд ли от этого браузер зависнет
ну так выще же писали что в phpMyAdmin запрос выполнился за 8 сек, хотя это тоже много)
откуда там 1.5 минутам взяться?)
*

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

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Unknown column 'file_type' in 'having clause'

Тьфу ты блин, забыл колонку:

Код: sql
SELECT 
  `file_title`,
  `file_url`,
  `published`,
  `virtuemart_media_id`,
  `file_type`
FROM #__virtuemart_medias AS m
LEFT JOIN #__virtuemart_product_medias AS pm USING(virtuemart_media_id)
WHERE pm.virtuemart_media_id IS NULL
HAVING file_type = 'product'
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
А самой главной-то директивы для табличек INNODB нету :)
Код
innodb_flush_log_at_trx_commit=0
а в какой раздел my.cnf вставлять этот параметр, есть разница?
*

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

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

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Вот настройки с конфига вашего мускул. Расскоментируйте и рестарт мускул
Код
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2
#log-queries-not-using-indexes
Потом в логе mysql-slow.log  будет весь запрос
это не повесит окончательно сервер? :) это же дополнительная работа как понимаю, логирование
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
вставьте EXPLAIN SELECT в запрос и выполните его в phpMyAdmin
или включите отладку в настройках сайта - Система - включить Отладка системы
или $db->explain();
и смотрите как выполняются запрос
понятно что если ответ запроса велик а общение с MySQL идет по tcp(удаленный хост), а не с помощью сокетов(localhost)
то дополнительно будет время тратится на доставку ответа, который зависит от канала связи между вашим сайтом и сервером на котором находится база данных
*

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

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

Slow log пишется редко, а информация очень нужная. Если slow log не пуст, то экономить ресурсы на логировании не серьёзно. Этот лог должен быть пустым.
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
ну так выще же писали что в phpMyAdmin запрос выполнился за 8 сек, хотя это тоже много)
откуда там 1.5 минутам взяться?)
Лучше об этом расскажет видео
Кстати это с
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2
и
innodb_flush_log_at_trx_commit=0
а запрос, Филипп, на видео:
Код: sql
SELECT 
  `file_title`,
  `file_url`,
  `published`,
  `virtuemart_media_id`,
  `file_type`
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
HAVING file_type = 'product'
простите, должен откланяться до завтра
*

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

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Да, значит having катит только с агрегатами. Пробуйте тогда запрос с WHERE, где is_null идёт раньше.
*

ProtectYourSite

  • Живу я здесь
  • 2356
  • 135 / 4
  • Безопасность вебсайтов
Файлов в каждой из папок на боевом сервере примерно по 23 000.
Немного не по теме, но не советовал бы такое количество файлов в папке -  могут быть различные проблемы с чтением директории. Намного лучше будет разбивать папку на множество подпапок
*

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

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Немного не по теме, но не советовал бы такое количество файлов в папке -  могут быть различные проблемы с чтением директории. Намного лучше будет разбивать папку на множество подпапок

Вот уж не по теме, точно. Для начала, откройте папку system32 на своём домашнем ПК -- удивитесь. Да и зачем сканировать директорию, если пути каждого элемента прописаны в базе?
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Всем доброго утра! Продолжаю:
вставьте EXPLAIN SELECT в запрос и выполните его в phpMyAdmin
скриншот прикладываю. Пошел читать, что это означает :)

Почитал, пока мало что понял :)
« Последнее редактирование: 13.07.2017, 15:58:13 от borro »
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Приступаю к вопросу лимитирования sql-запроса. Как вычислить, количество добываемых из базы данных строк, при котором текущий используемый хостинг не повесится? То есть в исходных данных: неизвестный хостинг, и надо как-то оценить его лимиты. Наверно в момент установки компонента запустить какой-то скрипт, который это оценит. Или дать возможность запуски этого скрипта в настройках компонента. Но пока ни первый, ни второй вариант не знаю с чего начать реализовывать, это через js файл должно все запускаться, который подключается скажем при клике на определенном подпункте меню компонента или как?..
« Последнее редактирование: 13.07.2017, 16:17:59 от borro »
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
Я же писал выше.

Одна из моих реализаций 2004-го года в биллинговой системе делала так: в момент первого запуска включался счетчик. Шли запросы в базу по одному в цикле, счетчик считал интерации. По достижении 20 сек. цикл завершаем. У нас есть значение - количество интераций, которые удалось выполнить за 20 секунд. Следующий запуск делаем с учетом полученного значения.

Вы этот пример можете использовать в вашей работе. Алгоритм такой: отдаем клиенту JS-скрипт, который работает в паре с php-скриптом. JS делает запросы с периодичностью, скажем, 1 сек. Вам нужно замутить прогресс-бар. Вы перед первым запуском запрашиваете у базы общее количество строк, которые предстоит обработать. И пусть это значение - 100% вашего прогресс-бара. Запускаем первый цикл. В нем счетчик количества интераций, как я писал выше. Допустим, за 1 секунду выполнилось 5 запросов. Теперь вы уже можете посчитать и показать пользователю сразу несколько данных, а именно: текущее значение прогресс-бара и приблизительное время работы скрипта. При этом php запоминает в отдельном файле или передает в JS текущее положение указателя (например, обработаны строки с 1 по 5, начинать с 6). Далее JS периодически каждую секунду делает запрос к скрипту. И цикл повторяется, но уже без участия счетчиков (либо корректируем время завершения).

Следует помнить, что полученное количество интераций непостоянно и зависит от однотипности строк таблицы, от загруженности сервера, от погоды, от сексуальный предпочтений админа и т.п., поэтому берем не полученное значение интераций, а немного с учетом возможной погрешности, например, умножив на некий процент.

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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
2SeBun
А почему не считать время прямо в PHP-скрипте, завершать цикл при наступлении конца периода и передавать ответ AJAX-скрипту, который будет делать новый запрос с учетом полученного ответа?
По теме: насколько я понял, у ТС всего 1 запрос, но он (или скрипт) по какой-то причине пашет 2 минуты.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
А почему не считать время прямо в PHP-скрипте, завершать цикл при наступлении конца периода и передавать ответ AJAX-скрипту, который будет делать новый запрос с учетом полученного ответа?
По теме: насколько я понял, у ТС всего 1 запрос, но он (или скрипт) по какой-то причине пашет 2 минуты.
Я его там и предлагал считать, возможно, не так выразился. В JS передаем только указатель, ну и флаг завершения. А что касается запроса ТС, не уверен, что выборка громадного массива из базы - правильное решение. Проще дергать кусками. Перепишет запрос правильно, и вопрос отпадет.
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
SeBun, что-то я не понимаю Вас, простите. Может у нас в головах разные типы решаемых задач? Или я не дорос до высоты вашей мысли :)
Мне нужно создать вид, который будет выводить с помощью AJAX результаты выше разбиравшегося запроса:
Код: 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'
LIMIT X,Y
как понимаю этот самый подгружаемый js скрипт должен периодически запускать этот запрос через связанный php файл, указывая ему X и Y как параметры.
И вопрос как рассчитать эти X,Y, точнее вопрос больше в Y, который определяет количество возвращаемых строк, за счет чего как я понимаю решится вопрос с нагрузкой на какой бы там ни был сервер. То есть я в цикле базу не беспокоил в текущей версии компонента. Это только сейчас я планирую эту диверсию. И сколько строк вернёт этот мой запрос я не могу заранее знать(для целей прогресс бара), поскольку уже этот запрос иногда вешает сервер. Вопрос в Y, как его оценить?
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
Как расчитать Y я написал, с помощью счетчика интераций. Давайте с другого конца подойдем. Сколько времени выполняется запрос, если LIMIT=1?
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Сколько времени выполняется запрос, если LIMIT=1?
Мгновенно. Сам сервер БД работал 0.0688 сек.
Без LIMIT 8.1403 сек, всего 130 записей. Но проблема похоже не столько в сервере БД, сколько в том, что(или кто) участвует в выводе этих данных на экран после окончания работы БД над запросом(в phpMyAdmin вывод появился попрежнему через полторы минуты, также было и при ожидании вывода в админке сайта)
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
Вы можете сделать этот запрос и замерить время его выполнения в вашем скрипте с установленным Limit 1. А дальше, зная это время, можете рассчитать примерно, сколько запросов выполнится в течении 1 сек, либо сколько строк лучше брать из базы, что бы уложиться в период менее 1 сек. Имейте ввиду, что при увеличении значения Х в вашем LIMIT будет расти время запроса к базе. Тут лучше использовать LIMIT Х OFFSET Y, хотя это почти то же самое.
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться