日期:2014-05-16  浏览次数:20719 次

mysql中pager命令的妙用
  在mysql 中,如果linux下,使用pager命令将大大提高工作效率,下面重点看几个例子:

1 首先看下基本用法

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

   这个时候就可以开始使用了less模式了,可以使用空格到下一页,quit退出;
甚至可以直接执行linux下的脚本,比如有个脚本在 /tmp/下的lock_waits.sh
则可以:
   mysql> pager /tmp/lock_waits
PAGER set to '/tmp/lock_waits'

  会执行/tmp/lock_waits的脚本
  
2 当要处理大量的数据集的时候,如果只想关心结果,可以这样:
   mysql> pager cat > /dev/null
PAGER set to 'cat > /dev/null'

#比如执行一系列的冗长的执行计划语句 ,忽略中间过程输出,直接只显示耗时
mysql> SELECT ...
1000 rows in set (0.91 sec)


mysql> SELECT ...
1000 rows in set (1.63 sec)


3 又比如,如果你在进行SQL调优,有大量的结果产生
  mysql> SELECT ...
[..]
989 rows in set (0.42 sec)
   可以通过checksum去比较每次调整后的SQL语句所产生的结果是否是相同的

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)
  这里checksum不同,所以重写的SQL语句有问题
  

4 如果有大量的连接,用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)
  马上看到当前有多少连接sleep了;
  进一步,要知道每一种状态的连接情况,可以这样:
    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

当然,也可以用SQL查询的方式实现了:
mysql> SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND='Sleep';

SELECT COMMAND,COUNT(*) TOTAL FROM INFORMATION_SCHEMA.PROCESSLIST GROUP BY COMMAND ORDER BY TOTAL DESC;