MySQL - статистика нагрузки

fender

Новичок
MySQL - статистика нагрузки

Пришло письмо от админов валуя:

Работа вашей базы вызывает недопустимую нагрузку на сервер баз
данных. Ниже резюме по сегодняшним медленным запросам:
===================================
Total Query_time: 84.3333333333333 min
Average Query time: 25.5555555555556 sec

Total Lock_time: 6 sec
Average Lock time: 0.0303030303030303 sec

Total Rows_sent: 5162416
Average Rows sent by query: 26072.8080808081

Total Rows_examined: 5162416
Average Rows examined by query: 26072.8080808081

Rows_sent/Rows_examined: 100 %
Total Query: 198
===================================

В основном медленные запросы составляет всего один запрос:
# Time: 060315 18:54:20
# User@Host: example @ v43.valuehost.ru
# Query_time: 16 Lock_time: 0 Rows_sent: 26555 Rows_examined: 26555
select * from gb;

Не очень понятно зачем вы используете базу, если вы выбираете из неё все
значения.
Для включения базы вам следует убрать с сайта все конекты к ней. После этого
мы включим доступ к базе.
Пожалуйста пересмотрите способ работы с базой.
Вопроса два:
1) Как собрать такую статистику самому (Total*, Average* за период)

2) Как так происходит что этот запрос который в консольном клиенте выполнятся за 0.01 сек., выполняется 25 секунд?
Код:
mysql> explain select * from gb; 
+-------+------+---------------+------+---------+------+-------+-------+
| table | type | possible_keys | key  | key_len | ref  | rows  | Extra |
+-------+------+---------------+------+---------+------+-------+-------+
| gb    | ALL  | NULL          | NULL |    NULL | NULL | 26562 |       |
+-------+------+---------------+------+---------+------+-------+-------+
1 row in set (0.01 sec)
Может, была пиковая нагрузка или медленный коннект с сервером БД и тормозило все не только у меня, а мой запрос случайно попался на глаза? Скрипту 5 лет в обед, раньше что-то никому не мешало... ))
Запрос-то ведь действительно простой - ни объединений, ни сортировок, строк всего 26 тысяч...
Что-то мне подсказывает, что я тут не виноват, а админы гонят.
И меры не самые красивые, но об этом я им отдельно напишу

Вот кусок кода где этот запрос выполняется:
PHP:
//узнаю кол-во записей для постраничного вывода
//про count() 5 лет назад я наверное не знал 
$num = mysql_num_rows(mysql_query("select * from gb")); 
$pages = ceil($num/$num_per_page);
Может медленно работает mysql_num_rows, но я сомневаюсь.
А еще порадовала фраза "Не очень понятно зачем вы используете базу, если вы выбираете из неё все значения". Жгут!!! Я бы еще понял если сказали "все строки"... ... но в этом случае это тоже мое личное дело )))
 

440hz

php.ru
для подсчета кол-ва строк нормальные люди пользуют select count(*) as cnt from gb;

а засасывать все 26000 строк это ПОЛНЫЙ ДЕБИЛИЗМ.
 

fender

Новичок
спасибо, в курсе, сейчас не об этом
к тому же этот факт прокомментирован в посте
можно попросить тебя не писать сюда, кореш?
 

440hz

php.ru
fender
спросим по другому. что ты потом делашь с этими 26000 строками?

коменты не заметил. оранжевый почти не видно не сером.
сорри.

а LIMIT не подойдет уважаемому?

count(*) считаем общее кол-во, а LIMIT ыдергивет нужные записи для постраничного ывода.. ты же не все 26000 записей на странице выводишь? 8)
 

fender

Новичок
если верить EXPLAIN (хотя я точно не знаю как его юзать, давно с MySQL не работал) , то select count(*) as cnt from gb; выполняется ровно за такое же количество миллисекунд как и select * from gb;
 

440hz

php.ru
fender
может это время выполнения EXPLAIN, а не самого запроса. 8)))
 

fender

Новичок
Все что надо у меня сейчас используется - и LIMIT в том числе
Наверное все-таки на fetch уходит основная часть времени, а при плохом коннекте особенно долго. И еще наверное теоретически памяти может не хватать скрипту
 

440hz

php.ru
fender
так почему для подсчета кол-ва строк используется все таки select * from а не count? может я не понимаю этой гениальности, но засасывать 26000 строк в скрипт каженные раз - это накладно ...
 

magic

lancer
Автор оригинала: fender
если верить EXPLAIN (хотя я точно не знаю как его юзать, давно с MySQL не работал) , то select count(*) as cnt from gb; выполняется ровно за такое же количество миллисекунд как и select * from gb;
Ты сам подумай, что сказал.

В-первом случае результат выборки - числовое значение, во-втором - вся выборка из таблицы.
 

440hz

php.ru
magic
человек за 5 лет так ничему и не научился, наверное ... если вместо count(*) пытается еще и EXPLAIN пристегнуть в свое оправдание, а виноваты, как всегда тупые админы, которые не поленились и ему на запрос указали
 

fender

Новичок
еще раз для тех кто на бронепоезде: я сейчас не обсуждаю функциональность моего скрипта! я его переписал, сейчас там для подсчета кол-ва строк используется count(*), а для выборки сообщений - LIMIT
 

440hz

php.ru
fender
1. тогда хрен ли приводишь тут старый код?
2. сообщи об этом админам, что ты переписал код. пусть базу включат.
 

fender

Новичок
Короче.
Может я не знаю как EXPLAIN правильно использовать в MySQL. (см. первый вопрос, почему-то его никто не замечает)

Я согласен что в этом запросе была ошибка, и больше про это говорить не хочу.
Мне сейчас интересно:
1) как правльно собрать статитстику которую мне прислали
2) выяснить за счет чего так медленно выполнялся старый, НЕПРАВИЛЬНЫЙ запрос (для общего развития)

-~{}~ 16.03.06 14:27:

>2. сообщи об этом админам, что ты переписал код. пусть базу включат.
чтоб я без тебя делал! спасибо за совет!
 

440hz

php.ru
fender
1. show status
2. mysql_query('select * from table'); засасывает ВСЕ записи в память скрипта. mysql_fetch_* потом пробегается по уже сформированному ресурсу. понятно?
 

fender

Новичок
ну это в любом случае кое-что
трудно было эти же 2 вопроса в первом посте разглядеть?
 

440hz

php.ru
Автор оригинала: fender
>2. сообщи об этом админам, что ты переписал код. пусть базу включат.
чтоб я без тебя делал! спасибо за совет!
а ты ничего и не делал. привел тупой код, который, как выясняется ты переписал.

теперь может начнешь думать и читать все-таки документацию по тому предмету с которым работаешь.
 

magic

lancer
1) Как собрать такую статистику самому (Total*, Average* за период)
ХЗ. Даже лень вникать.

2) Как так происходит что этот запрос который в консольном клиенте выполнятся за 0.01 сек., выполняется 25 секунд?
Вариантов масса - кеширование запроса в клиенте, серверная и локальная БД не синхронизированны, разные настройки MYSQL и т.п.

Для выяснения скорости запросов лучшие собаководы рекомендуют BENCHMARK; EXPLAIN - это чтобы понять КАК происходит запрос, а не КАК БЫСТРО.

Общее тестирование скрипта - MySQL ab, Zend Profiler (если имеется); команда top в шеле.
 

donhenarophp

Новичок
**Вариантов масса - кеширование запроса в клиенте, серверная и локальная БД не синхронизированны, разные настройки MYSQL и т.п.

Да.
 
Сверху