Статьи

Удовольствие с пейджерной командой MySQL

 Это сообщение написано Стефаном Комбоудоном   в блоге MySQL Performance. 

В прошлый раз я написал несколько советов, которые могут сделать вас более эффективным при использовании командной строки в Unix. Сегодня я хочу больше сосредоточиться на пейджере.

Наиболее распространенное использование пейджера — это установка на пейджер Unix, например, less. Это может быть очень полезно для просмотра результата команды, охватывающей несколько строк (например SHOW ENGINE INNODB STATUS):

mysql> pager less
PAGER set to 'less'
mysql> show engine innodb status\G
[...]

Теперь вы внутри, lessи вы можете легко перемещаться по набору результатов (используйте q, чтобы выйти, пробел, чтобы прокрутить вниз и т. Д.).

Напоминание: если вы хотите оставить свой пользовательский пейджер, это легко, просто запустите pager:

mysql> pager
Default pager wasn't set, using stdout.

Или \n:

mysql> \n
PAGER set to stdout

Но команда пейджера не ограничивается таким базовым использованием! Вы можете передавать вывод запросов большинству программ Unix, способных работать с текстом. Мы обсудили тему , но вот еще несколько примеров.

Отказ от набора результатов

Иногда вы не заботитесь о наборе результатов, вы просто хотите увидеть информацию о времени. Это может быть правдой, если вы пытаетесь изменить планы выполнения для запроса путем изменения индексов. Отменить результат можно с помощью пейджера:

mysql> pager cat > /dev/null
PAGER set to 'cat > /dev/null'

# Trying an execution plan
mysql> SELECT ...
1000 rows in set (0.91 sec)

# Another execution plan
mysql> SELECT ...
1000 rows in set (1.63 sec)

Теперь намного проще увидеть всю информацию о времени на одном экране.

Сравнение наборов результатов

Допустим, вы переписываете запрос и хотите проверить, одинаков ли набор результатов до и после перезаписи. К сожалению, в нем много строк:

mysql> SELECT ...
[..]
989 rows in set (0.42 sec)

Вместо того чтобы вручную сравнивать каждую строку, вы можете вычислить контрольную сумму и сравнить только контрольную сумму:

mysql> pager md5sum
PAGER set to 'md5sum'

# Original query
mysql> SELECT ...
32a1894d773c9b85172969c659175d2d  -
1 row in set (0.40 sec)

# Rewritten query - wrong
mysql> SELECT ...
fdb94521558684afedc8148ca724f578  -
1 row in set (0.16 sec)

Хм, контрольные суммы не совпадают, что-то не так. Давайте повторим:

# Rewritten query - correct
mysql> SELECT ...
32a1894d773c9b85172969c659175d2d  -
1 row in set (0.17 sec)

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

Убираться SHOW PROCESSLIST

Если у вас много подключений к MySQL, очень сложно прочитать вывод SHOW PROCESSLIST. Например, если у вас есть несколько сотен соединений, и вы хотите знать, сколько соединений находится в спящем режиме, ручной подсчет строк из выходных данных SHOW PROCESSLIST, вероятно, не лучшее решение. С пейджером все просто:

mysql> pager grep Sleep | wc -l
PAGER set to 'grep Sleep | wc -l'
mysql> show processlist;
337
346 rows in set (0.00 sec)

Это должно быть прочитано как «337 из 346 соединений спят».

Немного сложнее сейчас: вы хотите узнать количество соединений для каждого статуса:

mysql> pager awk -F '|' '{print $6}' | sort | uniq -c | sort -r
PAGER set to 'awk -F '|' '{print $6}' | sort | uniq -c | sort -r'
mysql> show processlist;
    309  Sleep       
      3 
      2  Query       
      2  Binlog Dump 
      1  Command

Проницательные читатели заметят, что эти вопросы можно было решить, запросив INFORMATION_SCHEMA. Например, подсчет количества спящих соединений можно выполнить с помощью:

mysql> SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND='Sleep';
+----------+
| COUNT(*) |
+----------+
|      320 |
+----------+

и подсчет количества подключений для каждого статуса можно сделать с помощью:

mysql> SELECT COMMAND,COUNT(*) TOTAL FROM INFORMATION_SCHEMA.PROCESSLIST GROUP BY COMMAND ORDER BY TOTAL DESC;
+-------------+-------+
| COMMAND     | TOTAL |
+-------------+-------+
| Sleep       |   344 |
| Query       |     5 |
| Binlog Dump |     2 |
+-------------+-------+

Правда, но:

  • Приятно знать несколько способов получить одинаковый результат
  • Некоторые из вас могут чувствовать себя более комфортно при написании SQL-запросов, тогда как другие предпочтут инструменты командной строки

Вывод

Как видите, пейджер — ваш друг! Он очень прост в использовании и может решать проблемы элегантным и очень эффективным способом. Вы даже можете написать свой собственный скрипт (если он слишком сложен, чтобы поместиться в одну строку) и передать его на пейджер.