Биллинговая система Nodeny

Главная категория => Nodeny 50 => Тема начата: goletsa от 03 Июня 2014, 13:20:07



Название: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 03 Июня 2014, 13:20:07
Можно с этим что-то сделать?
Запрос может идти по 15-20 секунд.
И во время его выполнения блокируются все остальные запросы к базе (Locked в mtop'е).
(http://s019.radikal.ru/i614/1406/c5/f6a4bb1cbf5d.png)


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: Efendy от 03 Июня 2014, 14:12:14
Полный запрос не виден. Но подозреваю, что у тебя 50.32 версия в которой проблема когда дохрена ревизий. Можно решить удалением неактуальных ревизий, я уже не помню - другие наверняка знают


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 04 Июня 2014, 10:12:07
Полный запрос не виден. Но подозреваю, что у тебя 50.32 версия в которой проблема когда дохрена ревизий. Можно решить удалением неактуальных ревизий, я уже не помню - другие наверняка знают
Вроде крайняя из 50.32 стоит.
Вот тоже приходило в голову избавиться от старых ревизий, вопрос тогда как.
Еще когда на 50.19(точно не помню) обновлялись были проблемы с большим количеством ревизий, где-то топик был.
Там как раз проблема была при WHERE .. IN (вложенный запрос).

Нашел топик, там было 50.19->50.31. Где-то между ними ревизии полей появились.

220 тысяч записей в dopdata :(


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: Efendy от 04 Июня 2014, 11:10:35
ну вот я нашел в форуме

Код:
DELETE FROM dopvalues WHERE revision NOT IN (SELECT rev FROM rev_users) AND revision NOT IN (SELECT rev FROM rev_equip)

обязательно сделай бекап


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 04 Июня 2014, 12:49:43
ну вот я нашел в форуме

Код:
DELETE FROM dopvalues WHERE revision NOT IN (SELECT rev FROM rev_users) AND revision NOT IN (SELECT rev FROM rev_equip)

обязательно сделай бекап
Не сильно помогло, из 220к осталось 150к записей.
Остается только на N+ переежать?


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: Efendy от 04 Июня 2014, 13:16:50
50.33, только немного функционал уменьшится


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 04 Июня 2014, 13:18:15
50.33, только немного функционал уменьшится
Какой именно?


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: Андрій от 29 Января 2015, 15:26:32
пробую видалити в себе старі ревізії, але нічого не видаляється -

Код:
mysql> DELETE FROM dopvalues WHERE revision NOT IN (SELECT rev FROM rev_users) AND revision NOT IN (SELECT rev FROM rev_equip);
Query OK, 0 rows affected (1 min 29.53 sec)

mysql>


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 31 Июля 2015, 11:46:47
Грусть-пичаль, у меня время выполнения запроса доросло до 32 секунд.
Причем странно.
Раскатал базу на другой комп, на ссд\хдд - там запрос на незагруженной базе выполняется 12 секунд независимо от того с какого носителя загружена база. И в момент запроса сильно грузит 1 ядро.
Т.е. перенос основной базы на ssd и 24 потока на сервере бесполезны, так как запрос похоже грузит только 1 ядро.


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: Efendy от 31 Июля 2015, 15:00:14
А проверьте сколько времени выполняется

Код:
SELECT parent_id AS id, template_num, MAX(revision) AS rev FROM (SELECT * FROM dopfields f JOIN dopvalues v ON f.id=v.dopfield_id) d WHERE parent_type=0 GROUP BY parent_id,template_num

и

Код:
SELECT parent_id AS id, template_num, MAX(revision) AS rev FROM dopfields f JOIN dopvalues v ON f.id=v.dopfield_id WHERE parent_type=0 GROUP BY parent_id, template_num


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: Efendy от 31 Июля 2015, 15:23:08
Вообще, постарайтесь найти эти долгие запросы, постараюсь (не обещаю), что оптимизирую их. Что бы найти - включите дебаг режим в админке


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 31 Июля 2015, 17:02:48
Вообще, постарайтесь найти эти долгие запросы, постараюсь (не обещаю), что оптимизирую их. Что бы найти - включите дебаг режим в админке
А он один такой:
Код:
	Основной запрос:
SELECT SQL_CALC_FOUND_ROWS id FROM users WHERE grp IN (2,3,4,10,20,29,33,32,37,38,45,47,48,49,50,56,57,58,59,61,62,63,64,65,66,67,68,69,0) AND id IN (SELECT DISTINCT parent_id AS id FROM dopvalues WHERE revision IN (SELECT revision FROM dopvalues WHERE revision IN (SELECT rev FROM rev_users WHERE template_num=2) AND dopfield_id=8 AND field_value LIKE '32') AND dopfield_id=7 AND field_value LIKE '6') LIMIT 0,60
Время выполнения sql: 31.93646 сек
Всего строк: 27


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 31 Июля 2015, 17:06:15
А проверьте сколько времени выполняется

Код:
SELECT parent_id AS id, template_num, MAX(revision) AS rev FROM (SELECT * FROM dopfields f JOIN dopvalues v ON f.id=v.dopfield_id) d WHERE parent_type=0 GROUP BY parent_id,template_num
и

Код:
SELECT parent_id AS id, template_num, MAX(revision) AS rev FROM dopfields f JOIN dopvalues v ON f.id=v.dopfield_id WHERE parent_type=0 GROUP BY parent_id, template_num
Первый
Отображение строк 0 - 24 (25825 всего, Query took 2.1825 seconds.)
Второй
Отображение строк 0 - 24 (25825 всего, Query took 0.9509 seconds.)


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: Efendy от 31 Июля 2015, 22:59:16
Можно оптимизировать на ту одну секунду, что и дало изменение rev_users,  а толку? Чтоб вы понимали что делает этот запрос:
- те несколько сотен тысяч записей группируются по клиенту и выбирается максимальная ревизия для каждого (тут, кстати, оптимизируется та одна секунда и тут еще используются индексы). Получили 25 тыс записей
- в этих 25 тыс ищется поле, у которого значение = 32 (по твоему примеру), причем ищется по like - без индексов
- из полученного количества записей выуживаем ревизии и по каждому номеру ревизии выбираем набор данных с такой же ревизией и еще фильтруем по значению 6 (опять же без индексов)

К сожалению, такой пиздец для субд очень и очень затратен и оптимизировать это нихрена не удастся - неверная архитектура. Я это понял когда в моей сети стало 1000 абонов, поэтому я попытался улучшить ситуацию и убрал ревизии вообще нафик в 50.33 версии. Но полностью менять архитектуру уже было поздно. В N+ я и избавился от такой горизонтальной организации столбцов данных.

Запрос я вроде оптимизировал (надо тестить):

Код:
SELECT SQL_CALC_FOUND_ROWS id FROM users
WHERE grp IN (2,3,4,10,20,29,33,32,37,38,45,47,48,49,50,56,57,58,59,61,62,63,64,65,66,67,68,69,0)
    AND EXISTS(
  SELECT * FROM dopvalues d1 JOIN dopvalues d2 ON d1.revision=d2.revision
  WHERE d1.dopfield_id=8 AND d1.field_value LIKE '32' AND d2.dopfield_id=7 AND d2.field_value LIKE '6'
  AND EXISTS (SELECT rev FROM rev_users WHERE template_num=2 AND rev=d1.revision)
  AND d1.parent_id=users.id
)

Вопрос в том "как его в N50" внедрить?


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: Efendy от 31 Июля 2015, 23:12:04
Насколько я понял, надо править файл nDopdatAPI.pl функцию nDopdata_search


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 01 Августа 2015, 12:54:45
Насколько я понял, надо править файл nDopdatAPI.pl функцию nDopdata_search
Хорошо, спасибо, я просматривал исходники и видел где он там начинает собираться, попробую прикрутить его.


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: 0xbad0c0d3 от 02 Августа 2015, 10:42:14
>10k абонов, поиск по допданным отстреливает за <0.5 сек.
Переделывал поисковый механизм полностью, плюс создавал индексы в таблицах.
v. 50.33 на 50.32 сомневаюсь что что-то выйдет я думаю даже перейти на 50.33 уже даст прирост


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: Efendy от 02 Августа 2015, 11:42:13
Насколько я понял, надо править файл nDopdatAPI.pl функцию nDopdata_search
Хорошо, спасибо, я просматривал исходники и видел где он там начинает собираться, попробую прикрутить его.
если поднимешь виртуальную машину и н50.32, дашь доступ - попробую сделать


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 03 Августа 2015, 17:35:09
>10k абонов, поиск по допданным отстреливает за <0.5 сек.
Переделывал поисковый механизм полностью, плюс создавал индексы в таблицах.
v. 50.33 на 50.32 сомневаюсь что что-то выйдет я думаю даже перейти на 50.33 уже даст прирост
Я думал переделать через промежуточные таблицы, у меня раз в сутки строится таблица клиентов с адресами для работы других модулей, в принципе потерять в поиске пару новых клиентов не так критично чем каждый раз мучать тормоза.


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 03 Августа 2015, 17:35:38
Насколько я понял, надо править файл nDopdatAPI.pl функцию nDopdata_search
Хорошо, спасибо, я просматривал исходники и видел где он там начинает собираться, попробую прикрутить его.
если поднимешь виртуальную машину и н50.32, дашь доступ - попробую сделать
Если не получится то разверну.


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 17 Августа 2015, 14:47:08
Код:
SELECT SQL_CALC_FOUND_ROWS id FROM users
WHERE grp IN (2,3,4,10,20,29,33,32,37,38,45,47,48,49,50,56,57,58,59,61,62,63,64,65,66,67,68,69,0)
    AND EXISTS(
  SELECT * FROM dopvalues d1 JOIN dopvalues d2 ON d1.revision=d2.revision
  WHERE d1.dopfield_id=8 AND d1.field_value LIKE '32' AND d2.dopfield_id=7 AND d2.field_value LIKE '6'
  AND EXISTS (SELECT rev FROM rev_users WHERE template_num=2 AND rev=d1.revision)
  AND d1.parent_id=users.id
)

Вопрос в том "как его в N50" внедрить?
Хм, не совсем понимаю как сделать в такой ситуации поиск по 3 полям.
Т.е. придется делать еще JOIN dopvalues d3 ON d2.revision=d3.revision?


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: 0xbad0c0d3 от 18 Августа 2015, 08:13:43
А где тут джоины? С джоинами, как раз и будет все более или менее, а вот с подзапросами - беда


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: goletsa от 19 Августа 2015, 16:36:00
А где тут джоины? С джоинами, как раз и будет все более или менее, а вот с подзапросами - беда
Запрос же в цитировании есть.

А у вас диффы с вашим переделанным поиском есть под 32 версию? Я этот пока не прикрутил еще, другие штуки допиливал под себя.


Название: Re: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS
Отправлено: NodenY45 от 17 Апреля 2016, 08:06:52
А где тут джоины? С джоинами, как раз и будет все более или менее, а вот с подзапросами - беда
Запрос же в цитировании есть.

А у вас диффы с вашим переделанным поиском есть под 32 версию? Я этот пока не прикрутил еще, другие штуки допиливал под себя.

Присоединяюсь :) Есть диффы?