Окт 19

SELECT
t.TABLE_SCHEMA AS `db`, t.TABLE_NAME AS `table`, s.INDEX_NAME AS `index name`
, s.COLUMN_NAME AS `field name`, s.SEQ_IN_INDEX `seq in index`, s2.max_columns AS `# cols`
, s.CARDINALITY AS `card`, t.TABLE_ROWS AS `est rows`
, ROUND(((s.CARDINALITY / IFNULL(t.TABLE_ROWS, 0.01)) * 100), 2) AS `sel %`
FROM INFORMATION_SCHEMA.STATISTICS s
INNER JOIN INFORMATION_SCHEMA.TABLES t
ON s.TABLE_SCHEMA = t.TABLE_SCHEMA AND s.TABLE_NAME = t.TABLE_NAME
INNER JOIN (
SELECT TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, MAX(SEQ_IN_INDEX) AS max_columns
FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA != ‘mysql’
GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME
) AS s2
ON s.TABLE_SCHEMA = s2.TABLE_SCHEMA AND s.TABLE_NAME = s2.TABLE_NAME AND s.INDEX_NAME = s2.INDEX_NAME
WHERE t.TABLE_SCHEMA != ‘mysql’ /* Filter out the mysql system DB */
AND t.TABLE_ROWS > 10 /* Only tables with some rows */
AND s.CARDINALITY IS NOT NULL /* Need at least one non-NULL value in the field */
AND (s.CARDINALITY / IFNULL(t.TABLE_ROWS, 0.01)) < 1.00 /* unique indexes are perfect anyway */
ORDER BY `sel %`, s.TABLE_SCHEMA, s.TABLE_NAME /* DESC for best non-unique indexes */
LIMIT 10;

Это из лекции товарища Jay Pipes

Теги:
Сен 24

оригинал; полная цитата:
Сегодня был неожиданно удивлен, какие удобные штуки таит в себе 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;

Теги:
Сен 18

Установка
Скачать
После помещения библиотеки в папку с расширениями в php.ini надо написать

zend_extension = <путь-к-php>\ext\php_xdebug.dll

Далее ставим плагин для firefox – Xdebug Helper, настройка всего инструментария – в базе знаний Google
Работа с Xdebug под Eclipse
ещё про установку и настройку xdebug,
Профилирование с Xdebug на habrahabr.
Самое основное – параметр в php.ini

xdebug.profiler_enable_trigger=On

В итоге у меня получилось (php5.3)

zend_extension = путь-к-php53\ext\php_xdebug.dll
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_port=9000
xdebug.remote_host=localhost
xdebug.idekey=default

;xdebug.dump_once = On
;xdebug.dump_globals = On
;xdebug.dump_undefined = On
;xdebug.dump.REQUEST = *
;xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT

xdebug.profiler_enable=Off
xdebug.profiler_output_dir="c:\traces"
xdebug.profiler_enable_trigger=On
xdebug.profiler_output_name = cachegrind.out.%t.%p

Теперь достаточно передать в GET-параметре ?XDEBUG_PROFILE (вот как раз тут полезен XdebugHelper – там это можно включить для определённого сайта).
много ссылок на полезные статьи.
Инструмент для анализа логов Xdebug от создателя.

Дебаг проекта через NetBeans совместно с XdebugHelper:
запустить отладчик в NetBeans и затем нажать кнопку «run» (это NetBeans заставит слушать Xdebug), а затем открыть сайт с активированным на нём XdebugHelper’ом.

Теги:
Сен 08

При разработке сайта под большую нагрузку нужно постоянно искать слабые места в коде. К примеру, при добавлении нового функционала на частопосещаемой странице появился кусок кода (функция, метод), который заметно замедляет работу проекта в целом. Нет пределов совершенству, и проект можно вылизывать до бесконечности, но на что стоит обратить внимание – подскажет профайлер кода. Лично я использую в работе APD (Advanced PHP Debugger). Во-первых, он хранится в репозитории модулей PHP, во-вторых, мне понравилось им пользоваться, в-третьих, у автора есть достаточно подробное описание в книге «Профессиональное программирование на PHP», в-четвёртых, простота использования. Из минусов – давно не обновлялся и, видимо, уже заброшен разработчиком.
Установка производится с помощью инсталлятора PEAR

#pear install apd

После чего в файл php.ini необходимо добавить установленное расширение и произвести настройку. (Приведу для примера параметры для Windows)

zend_extension = <Путь к установленному php>\ext\php_apd.dll
apd.dumpdir = c:\apd_traces\ ; здесь будут храниться промежуточные файлы трассировок
apd.statement_trace = 1

Если вызвать phpinfo(), должен появиться раздел с параметрами APD.
Использование.
Активизируется трассировка путём включения в нужный php-файл вызова функции

apd_set_pprof_trace('c:\TEMP\apd_traces');

Протоколируется следующие события:

  • вход в функцию
  • выход из функции
  • использование инструкций include и require

.
При этом ведутся 3 счётчика:

  • Real Time – прошедшее реальное время
  • User Time – время, затраченное на пользовательский код
  • System Time – время, затраченное на системные вызовы

.
После того, как файлы созданы (т.е. скрипт отработал), можно, к примеру, закомментировать строку вызова

apd_set_pprof_trace('c:\TEMP\apd_traces');

(она больше не нужна).
При установке APD из репозитория в папке
<Путь к php>\PEAR\Console\ появится файл pprofp.
Далее можно создать файл, к примеру, run.bat:

php.exe pprofp -r c:\TEMP\apd_traces\pprof.00288.53 > c:\TEMP\apd_out_rmT.txt

где c:\TEMP\apd_traces\pprof.00288.53 – это промежуточный файл трассировок, созданный при выполнении скрипта, а c:\TEMP\apd_out_rmT.txt будет создан и будет содержать полезную информацию в удобной форме.
Можно, конечно, создать и более «умный» батник, котороый бы принимал имя промежуточного файла параметром, но статья не об этом.
В итоге в файле увидим время выполнения функций и количество вызовов, что в дальнейшем должно помочь писать более «быстрый» код.

Теги:
preload preload preload