最近在远程的一个数据库data warehouse 中做数据统计, 由于表都没有加索引,而我又只有select权限,
所以就得把远程数据库中的数据拖回到公司局域网中的测试机,加上索引再做统计,或者用shell,php等程序进行统计。
由于测试机的网速较慢,所以每次拖数据都要很长时间。看个实际的例子:
[zhaokunyao@localhost ~]$ date; mysql --login-path=zm_119 -Ns test -e "SELECT aid FROM test where i=1 ;" >1.out ; date
2013年 08月 05日 星期一 14:15:05 CST
2013年 08月 05日 星期一 14:15:58 CST
[zhaokunyao@localhost ~]$ wc -l 1.out
527758 1.out
一个字段,500K行数据,就要耗时 53秒
后来想到mysql client有一个compress的选项:
[zhaokunyao@ios ~]$ mysql --help|grep -i compress
-C, --compress Use compression in server/client protocol.
compress FALSE
默认没有启用压缩。
如果在服务端进行压缩,就可以大幅减少传输的数据量,尤其适用于我这种网速较慢的情况:
[zhaokunyao@localhost ~]$
[zhaokunyao@localhost ~]$ date; mysql --login-path=zm_119 -CNs test -e "SELECT aid FROM test where i=1 ;" >1.out ; date
2013年 08月 05日 星期一 14:16:12 CST
2013年 08月 05日 星期一 14:16:50 CST
[zhaokunyao@localhost ~]$ wc -l 1.out
527758 1.out
耗时38秒
速度提升了30%左右。
当然如果网速很快,传输的数据量又不大,那么启用压缩反而会有负作用。
下面说点其它的,这几天刚看到的一篇文章。
可以看到,上面的压缩,我在命令行中用的是-C, 其实也可以用 –compress ,甚至 –comp
因为comp是compress的前缀,mysql client会自动帮你扩展。
那么 –compr –compre –compres 也都是可行的。
但是 –com 却不行,因为:
[大硬盘][zhaokunyao@ ~]$/data/mysql/bin/mysql --com
/data/mysql/bin/mysql: ambiguous option '--com' (comments, compress)
com同时是 comments和compress的前缀,这样就有歧义了。
如果未来mysql client又增加了 –compact 或者 –compare的选项,
那么 –comp也就有产生了歧义,在老版本mysql client环境下完全正常的shell脚本到了新版本环境中反而有可能会出错。
mysql从5.7开始决定放弃这种前缀模式,要么写全–compress,要么就完全用简写-C。
目前的最新版本是5.6.13,会报warning:
[大硬盘][zhaokunyao@ DATA]$/DATA/mysql/bin/mysql --comp -V
Warning: USING UNIQUE OPTION prefix comp instead OF compress IS deprecated AND will be removed IN a future release. Please USE the FULL name instead.
/DATA/mysql/bin/mysql Ver 14.14 Distrib 5.6.13, FOR Linux (x86_64) USING EditLine wrapper
如果您的shell脚本里面有这种前缀缩写,还是尽早改过来吧。
参考:
http://mysqlblog.fivefarmers.com/2013/08/02/option-prefixes-deprecated/
20130815更新:
-C .. 会占用大量内存/交换空间,最后OOM了:
818 Aug 15 20:10:33 yw-0-0 kernel: Out of memory: Kill process 18530 (mysql) score 469 or sacrifice child
819 Aug 15 20:10:33 yw-0-0 kernel: Killed process 18530, UID 0, (mysql) total-vm:12403556kB, anon-rss:5280704kB, file-rss:4kB
不用-C,虽然也占用了很多内存,但是却不会出现OOM的情况 :
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28472 zhaokuny 20 0 14.3g 10g 64 D 1.6 86.3 6:18.63 mysql
猜测是在-C的情况下,mysql把网络中获取到的数据都扔在内存中, 全部获取结束,才会去解压缩,然后写入硬盘文件。
没有-C的时候, 获取到一定的数据就会直接写入硬盘文件。
[BIG HD][zhaokunyao@ data]$ ll cm_act_srv_1_20130814 -h
-rw-rw-r–. 1 zhaokunyao zhaokunyao 6.8G 8月 15 20:50 cm_act_srv_1_20130814
不过这个文件只有6.8G啊…点解mysql要用掉14.3G的虚拟内存?
|