mysql对大表执行update速度慢时,试试改用insert可能会有意想不到的发现

实例:需要根据用户日志的ip地址计算出其地理地址

表结构:

用户日志表(200万条记录),其中address是待填充的字段:

CREATE TABLE `tmp_open_ip` (
  `email` varchar(60) NOT NULL DEFAULT '',
  `address` varchar(50) NOT NULL DEFAULT '',
  `ip` int(10) unsigned NOT NULL DEFAULT '0',
  KEY `email` (`email`),
  KEY `ip` (`ip`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

另ip地址数据库表(44万条记录)

CREATE TABLE `ip` (
`s` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '开始ip',
`e` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '结束ip',
`a` varchar(50) NOT NULL DEFAULT '',
KEY `s` (`s`),
KEY `e` (`e`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

需要根据用户日志表 tmp_open_ip 里的 ip字段到ip地址数据库表里查询出对应的地理地址,将地址填充到address字段。

使用如下update语句执行:

UPDATE tmp_open_ip AS u 
INNER JOIN ip 
ON u.ip BETWEEN ip.s AND ip.e 
SET u.address = ip.a

在笔者的电脑上运行了速度非常之慢,执行了一个多小时(4500s)都没有完,也不知道还要多久。

实在看不过去,于是想到使用insert 是否会快一些,于是重新导一张表 tmp_open_log 与tmp_open_log完全一致。

创建一张表 tmp_open_address,是insert的目标表,为了速度更快,没建索引:

CREATE TABLE `tmp_open_address` (
`email` varchar(60) NOT NULL DEFAULT '',
`address` varchar(50) NOT NULL DEFAULT '',
`ip` int(10) unsigned NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8

执行insert 语句

insert into tmp_open_address (email,address,ip)
select l.email,ip.a,l.ip
 from  tmp_open_log as l inner join ip on l.ip between ip.s and ip.e ;
/* Affected rows: 2,543,124  Found rows: 0  Warnings: 0  Duration for 3 queries: 16.922 sec. */

不到17s!本来还想去倒杯水、稍事休息一下,结果已经执行完毕。

到本文写完时,前面的update语句已经执行了5000s,结束仍是遥遥无期。

所以,对于大数据量执行update时,可以考虑改用insert 语句实现,可能麻烦一些,但高速带来的收益远大于麻烦!

后记:

直接杀死了update进程,去看看update执行了多少:运行

SELECT * FROM `tmp_open_ip` where address!=''

结果只有 11,373 ,照这个速度,要运行N天....

解决ssh连接linux服务器速度慢

核心:

服务器端sshd配置文件 /etc/ssh/sshd_config 看是否有如下的两条配置条目

GSSAPIAuthentication no
UseDNS no

如果前面带#,请把#删掉,或者新添加入这样两行。
然后重启sshd服务,或者重启服务器也可以。

注意是文件 /etc/ssh/sshd_config 而不是/etc/ssh/ssh_config

 

ssh 登录远程服务器,速度非常慢,通过网上查询,发现有一个参数 -v 可以输出显示连接的具体消息。于是连接加上这个参数连接

[feng@fsc ~]$ ssh -v foo.path8.net
OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to v.path8.net [64.120.xxx.xxx] port 22.
debug1: Connection established.
debug1: identity file /home/feng/.ssh/identity type -1
debug1: identity file /home/feng/.ssh/id_rsa type 1
debug1: identity file /home/feng/.ssh/id_dsa type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host 'v.path8.net' is known and matches the RSA host key.
debug1: Found key in /home/feng/.ssh/known_hosts:4
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
/*--------- 这里停留的十多秒钟时间 ----------*/
reverse mapping checking getaddrinfo for srv3.mktmaster.net [64.120.xxx.xxx] failed - POSSIBLE BREAK-IN ATTEMPT!
debug1: Unspecified GSS failure.  Minor code may provide more information
Credentials cache file '/tmp/krb5cc_501' not found

debug1: Unspecified GSS failure.  Minor code may provide more information
Credentials cache file '/tmp/krb5cc_501' not found

debug1: Unspecified GSS failure.  Minor code may provide more information


debug1: Next authentication method: publickey
debug1: Offering public key: /home/feng/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env XMODIFIERS = @im=ibus
debug1: Sending env LANG = zh_CN.utf8
Last login: Mon Oct 24 10:26:30 2011 from 124.79.xxx.xxx
[feng@v ~]$

大概就是GSSAPIAuthentication这个参数的问题了,之前就是因为连接速度慢,网上查,说是/etc/ssh/sshd_config 里加入参数 UseDNS no,再加个GSSAPIAuthentication yes, 结果速度还是慢。
于是去把这行改为GSSAPIAuthentication no,重启服务器端的ssdh服务,再次连接,速度快多了。

参考

google的更新速度太快了,同时再骂一骂百度

google的更新速度太快了,昨天傍晚新购买了一个域名path8.net——个人不喜欢.com域名——晚上改换网站域名,计划原域名page99.net在一段过度期后作废。

具体什么时间作废,没法确定,因为这点是按google收录页面全部转到新域名的时间决定。也就是说,原域名没有存在价值后,就会直接删去。其它的搜索引擎,就不管了,尤其百度,收录量好像也不少,以site:page99.net查询,基本上所有页面都有收录。但排名好像不怎么高。排名不高倒也算了,更让人无法容忍的是,从百度搜索结果来的访问,几乎全是指向到首页的;指向文章内容页的几乎没有。众所周知的,几乎所有网站的首页,都是经常更新的,内容不稳定,指向到首页的搜索结果,实际上是没有意义的。但百度,还是这么搞,只能说它技术太差劲!

两个月前就想屏蔽百度蜘蛛,但没有真正做。下一步,再过两个月,如果百度还是这样,就直接屏蔽百度蜘蛛。

但百度贴吧、空间等里面的链接还是有必要手工修改更新一下。对网站监测数据表明,从百度空间里来的访问者,经常看好几页的,也就是这些人经常是高质量访客。

更重要是,百度空间带来的流量比百度搜索引擎带来的流量还要大!(当然都在10%以下)前面说过了,百度搜索引擎带来的质量太差劲,所以百度空间还是有必要维持一段时间的。
哈,扯了老半天,都是跑题了的!下面言归正传。

昨天晚上改换域名后,从google管理员工具里,提交域名更改,通知google,以加快收录索引的更新。

今天上午,就是刚才十分钟前,site:path8.net 结果共有24条记录,也就是说google管理员工具里的提交并没有生效,这里的收录的结果其实是google搜索蜘蛛发现新站点后,马上说加到搜索索引里的。