日期:2014-05-16 浏览次数:20894 次
????? 虽然现在经常使用图形化工具连接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/
?
?
?
?