Биллинговая система Nodeny
22 Ноября 2024, 22:49:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1] 2
  Печать  
Автор Тема: Очень долго выполняется SELECT SQL_CALC_FOUND_ROWS  (Прочитано 13186 раз)
goletsa
NoDeny
Спец
*

Карма: 21
Offline Offline

Сообщений: 973


Просмотр профиля
« : 03 Июня 2014, 13:20:07 »

Можно с этим что-то сделать?
Запрос может идти по 15-20 секунд.
И во время его выполнения блокируются все остальные запросы к базе (Locked в mtop'е).

Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #1 : 03 Июня 2014, 14:12:14 »

Полный запрос не виден. Но подозреваю, что у тебя 50.32 версия в которой проблема когда дохрена ревизий. Можно решить удалением неактуальных ревизий, я уже не помню - другие наверняка знают
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #2 : 04 Июня 2014, 10:12:07 »

Полный запрос не виден. Но подозреваю, что у тебя 50.32 версия в которой проблема когда дохрена ревизий. Можно решить удалением неактуальных ревизий, я уже не помню - другие наверняка знают
Вроде крайняя из 50.32 стоит.
Вот тоже приходило в голову избавиться от старых ревизий, вопрос тогда как.
Еще когда на 50.19(точно не помню) обновлялись были проблемы с большим количеством ревизий, где-то топик был.
Там как раз проблема была при WHERE .. IN (вложенный запрос).

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

220 тысяч записей в dopdata Грустный
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #3 : 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)

обязательно сделай бекап
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #4 : 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+ переежать?
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #5 : 04 Июня 2014, 13:16:50 »

50.33, только немного функционал уменьшится
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #6 : 04 Июня 2014, 13:18:15 »

50.33, только немного функционал уменьшится
Какой именно?
Записан
Андрій
NoDeny
Старожил
*

Карма: 3
Offline Offline

Сообщений: 294


Просмотр профиля
« Ответ #7 : 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>
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #8 : 31 Июля 2015, 11:46:47 »

Грусть-пичаль, у меня время выполнения запроса доросло до 32 секунд.
Причем странно.
Раскатал базу на другой комп, на ссд\хдд - там запрос на незагруженной базе выполняется 12 секунд независимо от того с какого носителя загружена база. И в момент запроса сильно грузит 1 ядро.
Т.е. перенос основной базы на ssd и 24 потока на сервере бесполезны, так как запрос похоже грузит только 1 ядро.
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #9 : 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
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #10 : 31 Июля 2015, 15:23:08 »

Вообще, постарайтесь найти эти долгие запросы, постараюсь (не обещаю), что оптимизирую их. Что бы найти - включите дебаг режим в админке
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #11 : 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
Записан
goletsa
NoDeny
Спец
*

Карма: 21
Offline Offline

Сообщений: 973


Просмотр профиля
« Ответ #12 : 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.)
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #13 : 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" внедрить?
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #14 : 31 Июля 2015, 23:12:04 »

Насколько я понял, надо править файл nDopdatAPI.pl функцию nDopdata_search
Записан
Страниц: [1] 2
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!