Название: Долго выполняются SQL запросы. Отправлено: goletsa от 14 Октября 2009, 13:58:03 После обновления на новую версию столкнулся с ОЧЕНЬ медленым выполнением запросов к базе.
Запрос типа Код: SELECT * FROM dopdata WHERE revision IN (SELECT rev FROM rev_users WHERE id=615) При этом если выполнять по отдельности то < 1c Код: Отображает строки 0 - 1 (2 всего, запрос занял 0.2474 сек.) Код: Отображает строки 0 - 7 (8 всего, запрос занял 0.0001 сек.) Код: Отображает строки 0 - 7 (8 всего, запрос занял 21.9042 сек.) Название: Re: Долго выполняются SQL запросы. Отправлено: goletsa от 14 Октября 2009, 14:52:14 Дали мну тут как решение измененный SQL запрос без вложенных SELECT'ов.
Код: select * from dopdata as d join rev_users as r on r.id=615 and d.revision=r.rev; Но понять бы почему всетаки оно работает медленно... Код: Отображает строки 0 - 7 (8 всего, запрос занял 0.2491 сек.) Название: Re: Долго выполняются SQL запросы. Отправлено: goletsa от 14 Октября 2009, 16:43:24 Немного пропатчил код функций на предмет измения запросов.
Так хоть база не ложится. listuser.pl.diff Код: d1102 1 SMain.pl.diff Код: d162 1 Efendy, выскажи свое слово? Название: Re: Долго выполняются SQL запросы. Отправлено: Efendy от 14 Октября 2009, 20:50:47 Дали мну тут как решение измененный SQL запрос без вложенных SELECT'ов. Да, мускул странно обрабатывает запрос. На самом деле там для него ничего не должно быть сложного. Есть проиндексированное поле revision, нужно найти уникальные значения этого поля, а потом сгруппировать по parent_id и получить максимальные значение revision (это вьюха rev_users). Почему когда используешь ее в качестве подзапроса, то мускул начинает сходить с ума и делает нереально избыточные операции - я так и не до конца понял. Насчет join у меня тоже была мысль. Надо будет потестировать.Код: select * from dopdata as d join rev_users as r on r.id=615 and d.revision=r.rev; Походу, мне versus присылал top твоей системы. Мускул откушивает около 0,5 Гб - уж очень похоже на ограничение на размер процесса в 512Мб. Название: Re: Долго выполняются SQL запросы. Отправлено: goletsa от 14 Октября 2009, 21:55:55 Я как и рекомендовалось в мануале увеличивал размер до 2G в loader.conf (Стоит всего 4гига).
Или еще гдето надо менять? В принципе можно и мускул на досуге пересобрать... Название: Re: Долго выполняются SQL запросы. Отправлено: Efendy от 15 Октября 2009, 07:32:54 Я как и рекомендовалось в мануале увеличивал размер до 2G в loader.conf (Стоит всего 4гига). Или еще гдето надо менять? В принципе можно и мускул на досуге пересобрать... Мускул не надо пересобирать. 1) Приметь по top бывает ли объем процесса mysqld > 512 мб 2) в /etc/my.cnf чему равно key_buffer? 3) это не есть решение проблемы, а обход: заменить SELECT lalala на SELECT SQL_BUFFER_RESULT lalala для задумчивых запросов тогда не будут лочиться таблицы 4) покажи в консоли mysql результат: Код: use bill; Название: Re: Долго выполняются SQL запросы. Отправлено: goletsa от 15 Октября 2009, 16:33:13 1)
Код: last pid: 10893; load averages: 0.08, 0.13, 0.15 up 29+10:05:58 18:29:09 2) Код: cat /etc/my.cnf | grep key_buffer 3) Код: mysql> explain SELECT * FROM dopdata WHERE revision IN (SELECT rev FROM rev_users WHERE id=615) Название: Re: Долго выполняются SQL запросы. Отправлено: Efendy от 15 Октября 2009, 18:48:45 с join-ами гороаздо эффективней план получается. Специфика мускула. Тогда поменяю в биллинге на join
Название: Re: Долго выполняются SQL запросы. Отправлено: Efendy от 15 Октября 2009, 22:20:58 В общем твой запрос неправильный, но зато ты натолкнул на мысль:
Код: "SELECT d.* FROM dopdata AS d INNER JOIN rev_users AS r ON r.rev=d.revision WHERE r.id=$id AND $and ORDER BY d.template_num,d.field_name" и перед этим Код: $and=$f{q}? "template_num=$Ftmpl" : "field_flags LIKE '%q%'"; заменить на Код: $and=$f{q}? "d.template_num=$Ftmpl" : "d.field_flags LIKE '%q%'"; Название: Re: Долго выполняются SQL запросы. Отправлено: Efendy от 16 Октября 2009, 07:56:22 кстати, попробуй еще изменить вьюху rev_users
Код: DROP VIEW IF EXISTS rev_users; это вообще должно сказаться на глобальном повышении производительности. Выяснил почему по-иному записанные запросы выполняются долго - мускул крайне неоптимально выполняет IN (SELECT ...) Название: Re: Долго выполняются SQL запросы. Отправлено: goletsa от 16 Октября 2009, 08:01:56 В общем твой запрос неправильный, но зато ты натолкнул на мысль: Это в каком месте? Код: "SELECT d.* FROM dopdata AS d INNER JOIN rev_users AS r ON r.rev=d.revision WHERE r.id=$id AND $and ORDER BY d.template_num,d.field_name" и перед этим Код: $and=$f{q}? "template_num=$Ftmpl" : "field_flags LIKE '%q%'"; заменить на Код: $and=$f{q}? "d.template_num=$Ftmpl" : "d.field_flags LIKE '%q%'"; В listuser.pl ? Кстати а как изменить тот запрос чтобы кнопки с домами появлялись? Там тоже вроде есть IN (SELECT... Цитировать кстати, попробуй еще изменить вьюху rev_users ок, попробую сегодняНазвание: Re: Долго выполняются SQL запросы. Отправлено: goletsa от 16 Октября 2009, 08:06:17 И еще вопрос.
Мне тут еще советовали сделать индекс для поля revision в исходной таблице (dopfileds чтоли...). Это повышает производительность или смысла нету? Название: Re: Долго выполняются SQL запросы. Отправлено: Efendy от 16 Октября 2009, 08:10:58 И еще вопрос. Мне тут еще советовали сделать индекс для поля revision в исходной таблице (dopfileds чтоли...). Это повышает производительность или смысла нету? там итак стоит индекс. в выборке уникальных домов на улице там так просто не получится, но я уже придумал и оттестировал одну вещь. суть ее вот в чем: Код: CREATE TABLE `test` ( Название: Re: Долго выполняются SQL запросы. Отправлено: dad Min от 23 Октября 2009, 17:39:39 при открытии "бланка настроек" и "клиентской статистике" запрос отрабатывался очень долго
пришлось сменить вложеные селекты выходит что мускул очень сильно затыкается из-за того что обрабатывается на каждую строку внешней выборки достаточно большое количество переборов строк внутренней. в "клиентской статистике" Код: $sth=&sql($dbh,"SELECT * FROM dopdata WHERE revision IN (SELECT rev FROM rev_users WHERE id=$_[0])"); Код: $sth=&sql($dbh,"SELECT * FROM dopdata LEFT JOIN rev_users ON revision=rev WHERE rev_users.id=$_[0]"); В "бланке настроек" Код: $sth=&sql($dbh,"SELECT * FROM dopdata WHERE revision IN ". замена Код: $sth=&sql($dbh,"SELECT dopdata.* FROM dopdata LEFT JOIN rev_users ON revision=rev WHERE parent_id=$Fid AND rev_users.template_num= ". увеличение производительности видно невооруженным глазом в консоле тестились запросы 6сек. первый 0.19 измененный Название: Re: Долго выполняются SQL запросы. Отправлено: Efendy от 23 Октября 2009, 20:09:58 Какая версия биллинга? Ибо
Код: WHERE revision IN (SELECT rev Код: SELECT * FROM dopdata WHERE revision= |