虽然现在经常使用图形化工具连接MySQL进行管理,但是总会有一天我们需要使用MySQL命令行。因此知道一些小技巧对工作还是很有帮助的。
注意:下边这些命令只在Unix/Linux下有效。
使用pager
很多图形化工具会自动对结果进行分页,十分方便。但是在MySQL命令行下却不是这样:它直接输出全部结果。这样十分麻烦,不过有个简单的方法,使用 pager 命令可以解决这个问题:
mysql> pager more
PAGER set to 'more'
mysql> select title from sakila.film;
+-----------------------------+
| title |
+-----------------------------+
| ACADEMY DINOSAUR |
| ACE GOLDFINGER |
| ADAPTATION HOLES |
| AFFAIR PREJUDICE |
| AFRICAN EGG |
| AGENT TRUMAN |
| AIRPLANE SIERRA |
| AIRPORT POLLOCK |
| ALABAMA DEVIL |
| ALADDIN CALENDAR |
| ALAMO VIDEOTAPE |
| ALASKA PHANTOM |
| ALI FOREVER |
| ALICE FANTASIA |
| ALIEN CENTER |
| ALLEY EVOLUTION |
| ALONE TRIP |
| ALTER VICTORY |
| AMADEUS HOLY |
--Plus--
另外一个关于 pager 的实例,如果你想估计一下InnoDB redo log的大小,需要抓取一段时间内Log Sequence Number的数据。不过SHOW ENGINE INNODB STATUS一行输出的结果太多了,不想每次都需要翻到想要看的位置,可以借助 pager 命令解决这个问题:
mysql> pager grep sequence
PAGER set to 'grep sequence'
mysql> show engine innodb status\Gselect sleep(60);show engine innodb status\G
Log sequence number 380166807992
1 row in set (0.41 sec)
1 row in set (1 min 0.00 sec)
Log sequence number 380170274979
1 row in set (0.00 sec)
当你想要禁用这个分页的功能时,简单的执行:
mysql> pager
Default pager wasn't set, using stdout.
使用edit
当要优化一个查询的时候,经常需要修改查询的内容,有的时候使用一个文件编辑器要比直接在命令行下修改方便的多,这个时候,我们可以使用 edit 这个命令。
我们先看一下下边这个查询:
mysql> select count(*) from film left join film_category using(film_id) left join category using(category_id) where name='Music';
现在我们想把 left join 的语句修改为 inner join,并把SQL语句变成大写的。用手工修改的方法十分麻烦,这时个以简单的执行 edit:
mysql> edit
然后就会打开默认的文本编辑器,里边是上一次执行的查询语句。默认的文本编辑器是vi,现在就可以使用vi的功能而不仅限于MySQL命令行了。
当你编辑完成后,保存并退出编辑器:此时返回到MySQL命令行下,这时可以键入 ; 或者 \G 来执行这个查询
使用tee
在一些情况下,如果你想测试一些命令来写一份文档,或者正处于一次紧急情况中,希望可以记录下所执行的查询。MySQL命令行提供了 tee 这个命令,可以把输入和输出记录到一个文件中,十分像Unix中的tee命令:
mysql> tee queries.log
Logging to file 'queries.log'
mysql> use sakila
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select count(*) from sakila;
ERROR 1146 (42S02): Table 'sakila.sakila' doesn't exist
mysql> select count(*) from film;
+----------+
| count(*) |
+----------+
| 1000 |
+----------+
1 row in set (0.00 sec)
mysql> exit
现在你可以查看一下 queries.log 这个文件,可以得到一份当前session内空的复制。
结论
MySQL命令行并不像很多图形化管理工具那么好用,但时如果你知道一些隐藏的功能,它会变得更加强大。如果你很喜欢这些小技巧,我会对这些被忽略又实用的小技巧再写另一篇。
原文地址: http://www.mysqlperformanceblog.com/2012/12/21/be-productive-with-the-mysql-command-line/