MySQL

индекс
230,82

MySQL Profiler: простой и удобный инструмент профилирования запросов

Сегодня был неожиданно удивлен, какие удобные штуки таит в себе MySQL. ;-)

Хочу представить вашему вниманию фичу MySQL — профайлинг.
Появилась она начиная с версии 5.0.37.

Всего парой запросов можно узнать, какими запросами формируется страница (для веб-девелоперов)
и почему она тормозит.

И раньше подобный функционал был доступен, но пользоваться журналом запросов не в пример сложнее.

Итак, как пользоваться:



mysql> set profiling=1;
mysql> select count(*) from comment;
mysql> select count(*) from message;
mysql> show profiles;

+----------+------------+------------------------------+
| Query_ID | Duration   | Query                        |
+----------+------------+------------------------------+
|        1 | 0.00012700 | select count(*) from comment |
|        2 | 0.00014200 | select count(*) from message |
+----------+------------+------------------------------+
2 rows in set (0.00 sec)



Вуаля! Все выполненные запросы за сессию с временем выполнения.

На мой взгляд очень просто и сверх-удобно.

Можно пойти дальше, и узнать подробно на что тратилось время по каждому запросу:

mysql> show profile for query 1;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000015 |
| checking query cache for query | 0.000021 |
| checking permissions           | 0.000003 |
| Opening tables                 | 0.000007 |
| System lock                    | 0.000004 |
| Table lock                     | 0.000023 |
| init                           | 0.000005 |
| optimizing                     | 0.000005 |
| executing                      | 0.000025 |
| end                            | 0.000003 |
| end                            | 0.000001 |
| query end                      | 0.000002 |
| storing result in query cache  | 0.000003 |
| freeing items                  | 0.000003 |
| closing tables                 | 0.000004 |
| logging slow query             | 0.000002 |
| cleaning up                    | 0.000001 |
+--------------------------------+----------+
17 rows in set (0.00 sec)


Подробнее о профайлинге в статье: Using the New MySQL Query Profiler

Upd: как точно подметил zayceslavshow profiles по умолчанию показывает профили для 15 запросов. Кол-во запрсов можно увеличить с помощью параметра profiling_history_size, но не более чем до 100.

mysql> set profiling=1;
mysql> set profiling_history_size=100;


PS: это мой первый пост, прошу не судить строго
+118
23 сентября 2009, 19:50
191

комментарии (50)

–3
nooze #
Да, mysql очень штука не простая. Меня больше всего радуют люди, которые говорят что MSSQL намного круче MySQL потому что там мол интерфейс и много инструментов а в mysql «ни хрена же нет, только запросы писать можно!»
+2
jeje #
Ну я бы сказал по другому, mssql круче, но для чего? Для обычных сайтов с малым кол-во посещений нет разницы какая субд, а вот при больших нагрузках и специфических задачах, тут уже нужно смотреть. У самого в проекте стоит mysql-кластер и жалоб никаких нет.
0
nooze #
Само сравнение оставим в покое, я говорю о доводах — типа консольная субд ущербна по определению
0
jeje #
В таком ракурсе согласен, данное утверждение просто смешное.
+1
Nascosto #
А чем отличается, как вы говорите «консольная субд», от субд, которая запускается в винде в виде «сервиса»? о_О
Субд и все эти примочки в виде ГУИ — абсолютно разные вещи…
Для мускуля тоже имеются ГУИ…
0
nooze #
Я то знаю, но почему-то некоторые думают иначе
+2
jinxal #
Я вот работаю в основном с MSSQL и очень люблю её за SQL Profiler, Query Analyzer, Management Studio и другие фичи. Когда пришлось работать с MySQL начал искать схожие по удобству, проработанности и функционалу утилиты для мускула, ведь «Для мускуля тоже имеются ГУИ». Боюсь вас разочаровать — ничего сравнимого с утилитами от мелкомягких для MySQL нету.
И не надо меня попрекать, что я гонусь за GUI. Просто GUI в MSSQL позволяет мне сделать и оттестировать гораздо больший объем работы и сделать это на более качественном уровне.

И сразу предостерегу от высокомерного «нам GUI не нужен» — тут в недавнем топике уже выяснили, что большая часть веб-разработчиков так и не удосужились освоить язык SQL на уровне, превосходящем простые запросы (к слову о HAVING ))) и имеют весьма туманное представление например о написании и отладке хранимых процедур.

Хочу заметить, что я не перестаю удивляться отсутствию многофункциональных систем разработки и отладки для MySQL — даже для вполне себе бесплатного Firebird можно найти хорошие коммерческие программы управления базами данных.
–7
jinxal #
Я кстати не говорю, что GUI для MySQL нет. Есть. Но довольно ущербный.
0
ainu #
navicat по мне удобнее аналогов. Для меня образец хорошего гуи для базы данных.
0
zerkms #
EMS, dbForge
+1
jinxal #
Ага, спасибо, буду смотреть. EMS на скриншоте и по описанию выглядит неплохо, не попадался почему-то он мне в моих поисках, так что может я и поторопился… Тогда примите извинения за необоснованный наезд. ;)
0
zerkms #
я бы порекомендовал таки познакомиться вначале с dbForge. потому как инструмент мало того, что функциональнее EMS, так ещё и бесплатный.
0
paules #
а есть что нибудь подобное для линукса? спасибо
0
zerkms #
EMS вполне бегает под wine.
Нативных инструментов не знаю :-(
0
shoorick #
Когда-то и EMS делал нативного клиента, но уже несколько лет прекратил — неприбыльно.
0
jinxal #
Это то и пугает. Несколько бесплатных менеджеров для MySQL, которые я использовал (не вспомню уже названия) не отличались особой стабильностью.
0
zerkms #
PMA + консоль :-)
+3
egorinsk #
Мне например, такой SQL pofiler, как в MySQL удобнее, чем ГУИшный, я могу в своем мини-фреймворке получить эти данные и вывести их тут же. под страницей. Могу скриптом их анализировать. А кнопки тыкать мне неохота (к тому же у всяких ГуИ для СУБД обычно скучный интерфейс, уснуть можно).

И вообще, зачем БД GUI? Она должна запросы выполнять.
–1
neyronius #
У нас подразделение, которое занимается разработкой на ASP.NET, большую часть времени проводит в Microsoft SQL Management Studio, так как вся бизнес логика основана на хранимых процедурах.
+1
nekt #
Вам никто не сообрал что хранение бизнес логики в процедурах некошерно?
0
catbegemot #
Там скорее всего не сама бизнес логика, а та ее часть, что должна работать на базе. Т.е. вместо query = «SELECT * FROM tblANYTHING» в коде стоит вызов хранимой процедуры через какой-то из connection objects, а уже в самой процедуре написано SELECT a, b, c FROM tblANYTHING
+2
jinxal #
И? MS SQL точно также умеет отдавать данные профайлера с помощью простых запросов, и уж если тебя SQL Profiler не устраивает, так ради бога, выводи ты профайл хоть в текстовик, хоть в xml, хоть на лету считай, как уж тебе захочется. Не надо думать что MS SQL не умеет что-то, что можно сделать в MySQL.
+1
grimskin #
0
catbegemot #
Особенно вот эта таблица порадовала: www.webyog.com/en/sqlyog_feature_matrix.php

Такое ощущение, что Community Edition ничего другого не делает, кроме показа баннеров :)
0
MobyDick #
Расскажите как сделали кластер из mysql?
0
jeje #
К сожалению поднимал кластер не я
0
AxisPod #
Спорный вопрос, графическими инструментами не так часто приходится для MSSQL пользоваться, но вот в моем случае, тестировался MySQL и MSSQL для использования для сервера приложений, при их возможностях работы с большими объемами данных и сложными выборками, победил MSSQL, но вот для сайта был все же MySQL выбран.
0
standov #
все хорошо кроме одного, я не могу из одной сессии профилировать другую, т.е. реально мне нужно в коде прописать включение, выключение и в конце дамп вывода в какой-то файл — это не удобно, если чисто посмотреть запросы то тут удобнее mysql_proxy — ничего не надо менять в проекте (ну только порт)
0
agorlov #
Конкретную сессию вылавливать очень сложно, т.к. средняя сессия работы с БД у нас длится в среднем меньше 0.2секунды

Для нас гораздо удобнее смотреть, по факту загрузки определенной страницы — чем она генерится.

С просмотра общего потока запросов мы начинали, в один момент времени база обслуживает
много пользователей и в общем потоке запросов трудно выделять свои.

я наткнулся на этот профайлер, когда мы думали как сделать вывод всех запросов в консоль FireBug (через firephp)… сначала начлали писать враппер вокруг класса доступа к БД…

но когда узнали про эту фичу — добавили два фрагмента кода, в самом начале программы, при подключении к БД, и в самом конце дампим в консоль,

при этом не нагружается код дополнительными подсчетами времени на каждый запрос, это за нас делает СУБД. код в итоге получился компактнее.

+1
ruskar #
В phpMyAdmin это тоже вроде как давно есть:

Free Image Hosting at www.ImageShack.us
+3
Yara #
ток загнется ведь phpMyAdmin на больших объемах базы в которой не одна сотня таблиц
0
pelenthium #
На больших обьемах как раз самое то в консоле, а на серваке GUI ненужен в принципе
+5
agorlov #
Большое спасибо всем, что поддержали мой пост и меня :)
–4
ilyaProphet #
интересно. возьму на заметку.

зы. вот же косяконул, забыл добавить в свой первый пост такой PS.
жду теперь, может нло подсобит ))
+1
Sef4eg #
завтра тете преподу по бд расскажу, пусть знает)
0
TITOFF #
Очень, очень и очень полезно. Теперь будет еще проще отлаживать запросы, особенно в неизвестных CMS и прочих чужих сайтах.
–2
butuzov #
Say «wellcome to my life» to dtrace
(http://mysqldatabaseadministration.blogspot.com/2007/05/dtrace-and-mysql-1.html)
–1
butuzov #
реально первый раз вижу когда плюют в карму кода дается линк на РЕАЛЬНо полезный продукт для работы с профилированием. к тому же дается линк на топики посвященные профилированию мускула…

хабр не тот… =(
НЛО прилетело и опубликовало эту надпись здесь
0
DeMx #
Написали бы нормально, что это за зверь и с чем его едят, получили бы желанные плюсы. Правда не от меня. :)
+1
zayceslav #
>какими запросами формируется страница (для веб-девелоперов)
и почему она тормозит
Позанудю: почему страница «тормозит» расскажет, скорее, EXPLAIN. А профайлер покажет как она тормозит.
Стоит упомянуть неудобство: show profile показывает профили максимум для 100 запросов :(
0
all #
а куда вам больше-то?
0
zayceslav #
Была необходимость.
0
sylvio #
если использовать грамотную обертку над мускулом, то каждую сотню запросов можно включать-выключать профайлинг для составления общего отчета
0
agorlov #
спасибо, добавил в пост
0
descentspb #
Классно! Жаль, ничего настолько удобного для Postgres'а нет. Может быть, кто-то знает для Postgres альтернативу (кроме pgFouine)?
+1
videns #
Профайлинг уже описывали довольно подробно:

habrahabr.ru/blogs/mysql/39818/
0
CapitanBlood #
«о сколько нам открытий чудных...»
спасибо за статью) как раз сейчас есть где её применить
0
barb #
Век живи — век учись. Спасибо!
0
zizop #
Сегодня использовал эту профилировку. Может это баг, может фича, но в выводе show profiles; вижу кусок запроса, а не весь. И фиг знает, почему он его отрезает :-(
Может у кого есть идеи по этому поводу? А то смысла в этом профилировщике вообще нет.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.