网站地图    收藏   

主页 > 后端 > PHP语言 >

mysql -C AND option prefixes_自学php网

来源:自学PHP网    时间:2014-12-04 21:50 作者: 阅读:

[导读] 最近在远程的一个数据库data warehouse 中做数据统计, 由于表都没有加索引,而我又只有select权限, 所以就得把远程数据库中的数据拖回到公司局域网中的测试机,加上索引再做统计,或...

最近在远程的一个数据库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的虚拟内存?
 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论