mysql命令行的一些小技巧
????? 虽然现在经常使用图形化工具连接MySQL进行管理,但是总会有一天我们需要使用MySQL命令行。因此知道一些小技巧对工作还是很有帮助的。
?
注意:下边这些命令只在Unix/Linux下有效。
?
使用pager
????? 很多图形化工具会自动对结果进行分页,十分方便。但是在MySQL命令行下却不是这样:它直接输出全部结果。这样十分麻烦,不过有个简单的方法,使用 pager 命令可以解决这个问题:
?
mysql> pager morePAGER 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 sequencePAGER set to 'grep sequence'mysql> show engine innodb status\Gselect sleep(60);show engine innodb status\GLog sequence number 3801668079921 row in set (0.41 sec)1 row in set (1 min 0.00 sec)Log sequence number 3801702749791 row in set (0.00 sec)
?????? 当你想要禁用这个分页的功能时,简单的执行:
mysql> pagerDefault 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.logLogging to file 'queries.log'mysql> use sakilaReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> select count(*) from sakila;ERROR 1146 (42S02): Table 'sakila.sakila' doesn't existmysql> 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/
?
?
?
?