SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.09.2010 23:05:25

godzeus
Участник
Зарегистрирован: 14.09.2010
Сообщений: 11

Гуру помогите пожалуйста, очень нужна ваша помощь.

Уважаемые форумчане и гуру MYSQL, я сам не программист, у меня есть сайт, где стоит SocialEngine, народу уже много, и у меня по логу медленных запросов вылазиет один запрос, который долго выполняется, но я не знаю как его оптимизировать sad помогите пожалуйста, из за него очень сильно тормозит сайт, хотя сервер выделенный и мощный. Очень надеюсь на вас, вот лог:
# Time: 100914 21:15:13
# User@Host: vocalist_mysql[vocalist_mysql] @ localhost []
# Query_time: 7.529639  Lock_time: 0.000110 Rows_sent: 0  Rows_examined: 0
SET timestamp=1284484513;
(
          SELECT
            '0' AS notify_grouped,
            count(se_notifys.notify_id) AS total_notifications,
            se_notifytypes.notifytype_id,
            se_notifytypes.notifytype_desc,
            se_notifytypes.notifytype_icon,
            se_notifytypes.notifytype_url,
            se_notifys.notify_urlvars,
            se_notifys.notify_text
          FROM se_notifys
          LEFT JOIN se_notifytypes
          ON se_notifys.notify_notifytype_id=se_notifytypes.notifytype_id
          WHERE
            notify_user_id='6'
          AND
            notifytype_group=1
          GROUP BY se_notifys.notify_notifytype_id
        ) UNION ALL (
          SELECT
            se_notifys.notify_object_id AS notify_grouped,
            count(se_notifys.notify_id) AS total_notifications,
            se_notifytypes.notifytype_id,
            se_notifytypes.notifytype_desc,
            se_notifytypes.notifytype_icon,
            se_notifytypes.notifytype_url,
            se_notifys.notify_urlvars,
            se_notifys.notify_text
          FROM se_notifys
          LEFT JOIN se_notifytypes
          ON se_notifys.notify_notifytype_id=se_notifytypes.notifytype_id
          WHERE
            notify_user_id='6'
          AND
            notifytype_group=0
          GROUP BY se_notifys.notify_notifytype_id, se_notifys.notify_object_id
        );
# User@Host: vocalist_mysql[vocalist_mysql] @ localhost []
# Query_time: 7.533834  Lock_time: 0.000099 Rows_sent: 2  Rows_examined: 34
SET timestamp=1284484513;
(
          SELECT
            '0' AS notify_grouped,
            count(se_notifys.notify_id) AS total_notifications,
            se_notifytypes.notifytype_id,
            se_notifytypes.notifytype_desc,
            se_notifytypes.notifytype_icon,
            se_notifytypes.notifytype_url,
            se_notifys.notify_urlvars,
            se_notifys.notify_text
          FROM se_notifys
          LEFT JOIN se_notifytypes
          ON se_notifys.notify_notifytype_id=se_notifytypes.notifytype_id
          WHERE
            notify_user_id='3287'
          AND
            notifytype_group=1
          GROUP BY se_notifys.notify_notifytype_id
        ) UNION ALL (
          SELECT
            se_notifys.notify_object_id AS notify_grouped,
            count(se_notifys.notify_id) AS total_notifications,
            se_notifytypes.notifytype_id,
            se_notifytypes.notifytype_desc,
            se_notifytypes.notifytype_icon,
            se_notifytypes.notifytype_url,
            se_notifys.notify_urlvars,
            se_notifys.notify_text
          FROM se_notifys
          LEFT JOIN se_notifytypes
          ON se_notifys.notify_notifytype_id=se_notifytypes.notifytype_id
          WHERE
            notify_user_id='3287'
          AND
            notifytype_group=0
          GROUP BY se_notifys.notify_notifytype_id, se_notifys.notify_object_id
        );

Неактивен

 

#2 14.09.2010 23:40:50

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

Нужны еще как минимум структуры таблиц (SHOW CREATE TABLE tablename)
и EXPLAIN от запросов (EXPLAIN SELECT …). В случае с UNION лучше отдельно
EXPLAIN верхней и нижней части.

Сходу кажется, что
a) лишние UNION в принципе, т.к. можно просто верхнее поле переписать
через IF();
б) лишние LEFT JOIN (больше подозрение, что notifytype_group — это поле из
se_notifytypes).

Неактивен

 

#3 15.09.2010 09:33:45

godzeus
Участник
Зарегистрирован: 14.09.2010
Сообщений: 11

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

Вот Show create table

CREATE TABLE `se_notifys` (
  `notify_id` int(9) NOT NULL auto_increment,
  `notify_user_id` int(9) NOT NULL default '0',
  `notify_notifytype_id` int(9) NOT NULL default '0',
  `notify_object_id` int(9) NOT NULL,
  `notify_urlvars` varchar(250) NOT NULL default '0',
  `notify_text` text NOT NULL,
  PRIMARY KEY  (`notify_id`),
  KEY `notify_user_id` (`notify_user_id`),
  KEY `notify_object_id` (`notify_object_id`)
) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci"


CREATE TABLE `se_notifytypes` (
  `notifytype_id` int(9) NOT NULL auto_increment,
  `notifytype_icon` varchar(50) NOT NULL default '',
  `notifytype_name` varchar(50) NOT NULL,
  `notifytype_title` int(9) NOT NULL default '0',
  `notifytype_url` varchar(100) NOT NULL,
  `notifytype_desc` int(9) NOT NULL default '0',
  `notifytype_group` int(1) NOT NULL default '0',
  PRIMARY KEY  (`notifytype_id`)
) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci"


Вот EXPLAIN верхней части:
http://vocalist.su/temp/explaintop.jpg

Вот EXPLAIN нижней части:
http://vocalist.su/temp/explainbuttom.jpg

Отредактированно godzeus (15.09.2010 09:34:40)

Неактивен

 

#4 15.09.2010 12:38:17

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

Эм. Вы выбираете 2 строки этим запросом по ключу. Даже те изменения,
которые я написал, не принесут большой производительности.

Оно в диск упирается или в процессор? Посмотрите, сколько памяти выделено
под буфер ключей (key_buffer_size). Ну и статистику интересно посмотреть:
SHOW GLOBAL STATUS LIKE 'key%';

Неактивен

 

#5 15.09.2010 12:45:05

godzeus
Участник
Зарегистрирован: 14.09.2010
Сообщений: 11

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

Нет, в таблице se_notifys сейчас около 8000 (сколько и пользователей) а их становится все больше. В se_notifytype (хранятся типы уведомлений), а в se_notifys (хранятся списки настроек уведомлений пользователей, сколько пользователей, столько и записей, а их не мало).

Вот такие настройки сейчас у меня
key_buffer_size = 128M
sort_buffer_size = 128M

Вот статистика:
Variable_name                     Value
Key_blocks_not_flushed           0
Key_blocks_unused       105352
Key_blocks_used         1820
Key_read_requests       4874694
Key_reads                    1873
Key_write_requests        18661
Key_writes                   2599

Отредактированно godzeus (15.09.2010 12:58:20)

Неактивен

 

#6 15.09.2010 13:04:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

Кошмар. У Вас с настройками всё хорошо. Запросы действительно тормозят?
Если его выполнить вручную — он и правда медленно отрабатывает?

Неактивен

 

#7 15.09.2010 14:28:17

godzeus
Участник
Зарегистрирован: 14.09.2010
Сообщений: 11

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

В ручную он выполняется моментально, вот сделал вручную (всего, запрос занял 0.0066 сек.) не понимаю, почему он попадает в лог медленных sad(((

Вложил лог, я уже не знаю что делать sad(( прямо руки опускаются

Хотя сервер просто отдыхает: Средняя загрузка 0.01 0.01 0.02, что делать? как узнать, что происходит?

Отредактированно godzeus (15.09.2010 14:34:47)


Прикрепленные файлы:
Attachment Icon mysql-slow.log, Размер: 93,483 байт, Скачано: 754

Неактивен

 

#8 15.09.2010 15:16:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

Поставьте atop, посмотрите нагрузку на сервер в моменты, когда
сыпятся сообщения в журнал медленных запросов. Скорее всего,
просыпается какая-то страшная ужасная штука, которая нагружает
сервер целиком.

Неактивен

 

#9 15.09.2010 15:35:09

godzeus
Участник
Зарегистрирован: 14.09.2010
Сообщений: 11

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

А как их отловить ? Эти моменты ?

Неактивен

 

#10 15.09.2010 15:55:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

atop пишет на диск состояние раз в некоторое количество времени.
А потом можно побегать по времени назад и посмотреть, что грузит
машинку.

Неактивен

 

#11 15.09.2010 16:11:36

godzeus
Участник
Зарегистрирован: 14.09.2010
Сообщений: 11

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

а я подумал что вы про mytop говорите smile сижу уже ловлю запросы smile

Неактивен

 

#12 15.09.2010 21:54:01

godzeus
Участник
Зарегистрирован: 14.09.2010
Сообщений: 11

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

У меня FREEBSD 64 для нее нет atop sad

Отредактированно godzeus (15.09.2010 22:23:36)

Неактивен

 

#13 16.09.2010 00:47:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

Хм. Кто ж ее знает, как эту операционку админить. У меня было несколько
случаев попыток, и все негативные — очень уж она напоминает «сделай сам» sad
Хотя и среди линукса есть любители пособирать из исходников, да smile

Если хотите сделать самостоятельно — можете сделать что-нибудь типа
while true; do ( date ; uptime ; ps axu ) >> logfile; done
В screen это запустить, а потом смотреть по нагрузке, когда пик, и что реально
грузит систему. Это в баше, в csh, который по умолчанию, не знаю.

Кстати, вроде, в бсд можно сделать какой-то обрезанный /proc, тогда и atop
может собраться.

Ну и, разумеется, приветствуются ответы людей, читающих форум, и умеющих
администрировать эту ОС smile

Неактивен

 

#14 17.09.2010 10:35:44

godzeus
Участник
Зарегистрирован: 14.09.2010
Сообщений: 11

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

Понаблюдал по htop
в основном такая картина что апач грузит сильно сервер, но почему не понятно

Неактивен

 

#15 17.09.2010 20:32:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Гуру помогите пожалуйста, очень нужна ваша помощь.

mod_php? Значит, такой код. Можете перейти на какую-нибудь человеческую
схему, запустив быстрый вебсервер (nginx, lighttpd, …) и php через fastcgi.
Выиграете процентов двадцать производительности. Ну и готовьтесь переписывать
код, если Вы действительно в него упираетесь sad

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson