一点技巧

一、快速往数据库插入数据的技巧: 到MySQL官方网站查了查资料,发现MySQL支持在一条INSERT语句中插入多条记录,格式如下: INSERT table_name (column1, column2, ..., columnN) VALUES (rec1_val1, rec1_val2, ..., rec1_valN), (rec2_val1, rec2_val2, ..., rec2_valN), ... ... (recM_val1, recM_val2, ..., recM_valN); 按MySQL官方网站,用这种方法一次插入多条数据,速度比一条一条插入要快很多。在一台开发用的笔记本电脑上做了个测试,果然速度惊人。 测试环境:DELL Latitude D630, CPU T7250 @ 2.00GHz, 内存 2G。Windows XP Pro中文版SP2,MySQL 5.0 for Windows。 MySQL是新安装的,建立了一个名为test的数据库,在test数据库建了一个t_integer表,共两个字段:test_id和test_value,两个字段都是INTEGER类型,其中test_id是Primary Key。 准备了两个SQL脚本文件(写了个小程序生成的),内容分别如下: -- test1.sql TRUNCATE TABLE t_integer; INSERT t_integer (test_id, test_value) VALUES (1, 1234), (2, 1234), (3, 1234), (4, 1234), (5, 1234), (6, 1234), ... ... (9997, 1234), (9998, 1234), (9999, 1234), (10000, 1234); -- test2.sql TRUNCATE TABLE t_integer; INSERT t_integer (test_id, test_value) VALUES (1, 1234); INSERT t_integer (test_id, test_value) VALUES (2, 1234); INSERT t_integer (test_id, test_value) VALUES (3, 1234); INSERT t_integer (test_id, test_value) VALUES (4, 1234); INSERT t_integer (test_id, test_value) VALUES (5, 1234); INSERT t_integer (test_id, test_value) VALUES (6, 1234); ... ... INSERT t_integer (test_id, test_value) VALUES (9997, 1234); INSERT t_integer (test_id, test_value) VALUES (9998, 1234); INSERT t_integer (test_id, test_value) VALUES (9999, 1234); INSERT t_integer (test_id, test_value) VALUES (10000, 1234); 以上两个脚本通过mysql命令行运行,分别耗时0.44秒和136.14秒,相差达300倍。 基于这个思路,只要将需插入的数据进行合并处理,应该可以轻松达到每秒1000条的设计要求了。 补充:以上的测试都是在InnoDB表引擎基础上进行的,而且是AUTOCOMMIT=1,对比下来速度差异非常显著。之后我将t_integer表引擎设置为MyISAM进行测试,test1.sql执行时间为0.11秒,test2.sql为1.64秒。 补充2:以上的测试均为单机测试,之后做了跨机器的测试,测试客户端(运行脚本的机器)和服务器是不同机器,服务器是另一台笔记本,比单机测试时配置要好些。做跨机器的测试时,发现不管是InnoDB还是MyISAM,test1.sql速度都在0.4秒左右,而test2.sql在InnoDB时且AUTOCOMMIT=1时要80多秒,而设置为MyISAM时也要20多秒。 方法一:用PHP构造一次插入多条,并多次以for插入,像装车一样,一车一车的把sql运过去。 方法二:如果是网络和循环太慢,则建议用C来做这个事情,会提高三倍左右的速度,相对PHP可能会有相当的提升。 方法三:用队列来做,分多个进程实现,可能有一定程序的时间上提高,同时要注意binlog的影响及索引的影响。BY:Jack 二、远程密令临时开启ssh端口 linux服务器,我们一般是通过ssh通道远程管理,这就需要我们开启ssh端口,如22。但开启端口有被暴力破解的风险,你会说可以设置复杂的密码或使用证书避免。就算破解不了密码,但openssh也可能会有漏洞,你会说可以更改ssh端口,但还是有可能被扫描出来。还有一种选择,我们可以只允许指定IP访问ssh,通过vpn登录管理服务器,但局限很明显,万一紧急情况vpn登录不上去了怎么办。下面给出一种个人觉得比较满意的解决方案,即使用iptables的recent模块,通过密令临时开启ssh端口。当然,密令需要保管好,防止外泄。 1、iptables规则设定 #指定78字节的icmp数据包(包含IP头部20字节,ICMP头部8字节)通过被加入sshopen列表。 iptables -A INPUT -p icmp --icmp-type 8 -m length --length 78 -m recent --set --name sshopen --rsource -j ACCEPT #检查sshopen列表是否存在你的来源IP,如果存在,即从第一次使用密令开始15秒钟内开启ssh端口22,超过15秒端口自动关闭,不再允许新连接,已连接的不会断开。 iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 15 --name sshopen --rsource -j ACCEPT 2、临时开启ssh端口密令 linux下:ping -s 50 host windows下:ping -l 50 host 参考:http://blog.onovps.com/archives/iptables-recent.html
posted @ 2012-12-09 13:07  gxldan  阅读(151)  评论(0编辑  收藏  举报