March 7th, 2009 by 张磊
还是我做的淘宝随机商品的玩意,现在有大约30万的数据,用MyISAM表存放。随机推荐商品我一个随机的查询来实现,原来的语句是这样的: select * from goods where id >= (ceil ( select max (id) from goods ) ) limit 1 因为id是主键,上面有索引,所以执行起来挺快。但我发现需要增加一个字段用来标识那些不适合推荐出来的商品,比如很多丰胸的减肥的,于是就增加了一个hide字段。这个字段我建了索引,但可能的值只有0和1,大家也知道,在这上面建索引意义不大。相应地,SQL语句改为: select * from goods where id >= (ceil ( select max(id) from goods where hide=0 ) ) and hide = 0 limit 1 在我的服务器上,上面的语句跑一次大概需要1.4秒。这很难接受,于是考虑做优化。 此处我联想到看过的一些文档:在Innodb中,Secondary Index的所有Leaf Nodes上面同时包含了所指向数据记录的主键信息,而不是直接指向数据记录的位置信息;而在MyISAM表中正好相反。上面的查询语句,子查询正是要用到主键的信息,于是我考虑把hide 和主键 id做联合索引。索引生成以后,先用explain查看一下: 发现其中的“Subquery”已经显示“Select tables optimized away”。尝试查询(为了显示出来干净,仅查询了id和title两个字段): 时间是0.00秒,比起优化之前,降低了两个数量级。改为联合索引起到最大的作用是让中间的子查询不需要去表中查找信息返回最大的id值,而直接可以从索引中得出。 这个故事告诉我们,MySQL里建立索引应该考虑数据库引擎的类型。我自问对Mysql还不够了解,持续学习中。
August 22nd, 2008 by 张磊
SimpleTagging插件是我一直都在blog上用的tag插件,哪怕WP出来了内建的tag支持,我还是保留了SimpleTagging,因为它可以提供一个相关文章列表。为了这个相关文章,我每次写东西都会添加两次tag:一次是添加到wp自带的tag系统,一次是SimpleTagging。 但昨天发现服务器上mysql数据库进程的CPU占用经常有大的波动,忍不住用show processlist;看了一下。发现在CPU占用较高的时候,主要是涉及到SimpleTagging进行相似度比较的操作。由于我的文章太多、查询的语句也比较复杂,所以Mysql每次都会进行”copying to tmp table on disk”。可想而之,这样的操作有多耗资源。不过还是可以较快地处理完,所以在slowquerylog里没有这些查询。 但还是不能容忍每一次查询都来一个copying to tmp table on disk,权衡之下,只好干掉了SimpleTagging插件。这下不能显示相关文章了,但好处是不用每次写文章都加两次Tag了。Wordpress作为一个blog系统是非常好用,但插件往往会用得太多,一个页面要几十次查询的情况非常普遍。当文章的量比较大(我已经有一千几百篇文章),SimpleTagging需要在这么多文章中寻找相似条目,自然会慢下来。至于copying to tmp table on disk的出现,往往意味着还要进行file sort,在开发的时候,应该多用explain,看看能做哪些优化。
May 12th, 2008 by 张磊
心血来潮去翻Fenng以前整理出来的大型网站们批露的架构方面的信息,看到的都是很典型的,基于ROR的财帮子(不晓得现在JavaEye流量大还是财帮子大),基于.net的“PlentyOfFish”,深藏不露的豆瓣以及非常平民化的facebook(用的是PHP+MySQL)。有点纳闷,这些网站怎么没一个用java的,虽然说是“Architecture Scale”,但看起来java确实不受待见阿。 翻到Facebook的时候注意到它用了Memcached和APC。Memcached我已经用在服务器上了,APC以前在Dreamhost时使用过,不过效果一般。这里谈到Facebook用APC使得“一个页面显示的时间从4000多毫秒降到了100多毫秒”,肯定不是所有用了APC的地方都能有这么大的提升,但是使用APC确实能为PHP加速。 由于PHP是个解释型语言,执行的时候先得把程序读进来,(进行基本的差错,)然后“解释”成机器可以跑的程序。解释就会生成Opcode,如果可以把这个Opcode缓存起来,下次就能避免重新解释了。想想一下很多大型的系统,一个页面会包含很多文件,所以把这些文件的opcode存储起来,效果有点像“片段缓存”。我所知道的可以做PHP中opcode缓存的除了APC还有XCache,今天就安装了APC在自己的服务器上。 借用下面这张图,应该能弄清楚APC的作用了。 网上有很多在linux服务器上安装APC的指导,其实作为PHP的扩展,在windows的安装大同小异。先去perl4win.php.net,搜索APC,就能找到可以下载的DLL文件。这时需要选择一个和服务器PHP版本相匹配的。我服务器上的PHP是5.2.3,就下载了最后一个DLL。 下载回来后放到PHP插件文件夹,一般是php目录下的”ext”文件夹。之后编辑php.ini,在末尾加入: [apc] extension=”php_apc.dll” apc.enabled=1 apc.shm_segments=1 apc.shm_size=48 apc.ttl=7200 apc.user_ttl=7200 apc.num_files_hint=1024 apc.mmap_file_mask=d:/tmp/apc.XXXXXX apc.enable_cli=1 其中apc.shm_size就是给APC开的缓存大小,单位是M。我之前开了16M,有点小,就改成了48M。保存php.ini之后重启apache,如果你有一个显示phpinfo()的网页,刷新就能看到安装完成的apc了。 如果想得到apc运行的更多信息,可以去下载一个APC源代码包,里面有一个apc.php,放在web目录下就可以看到APC运行的详细情况。见下面的图:
November 4th, 2007 by 张磊
最近blog的流量又有了些提升,并且和以前那样突然因为某个关键词而流量上升不同了,这次已经稳定下来,保持在日IP150~200的区间。最开始写blog的时候,根本不知道啥是SEO。结果写了一年,日IP还停留在20~30。当时觉得如果有一天能有50IP,真是了不起阿。 后来换了一次blog系统,换到了WP。依然不知道啥叫SEO,还破坏了原有的很多链接——现在想想,以后再也不能干这种傻事了。后来智勇就教了我点SEO方面的入门知识,非常感叹他一个放着不管的小网站都能有不少收入。为啥呢?SEO做得好呗。 今天就随便写写我以前和最近对SEO的一些心得。主要会以这个用Wordpress搭建的blog为例。现在的情况是每天IP在150~200,从搜索引擎过来的流量超过了80%,还有超过10%是自己输入网址的固定群体。 下面是最近7天我的blog页面浏览的统计(数据来自51啦): 地址 入口 比例 浏览 比例 www.blogkid.cn 301 41.7% 453 47.1% /archives/1095 66 9.2% 71 7.4% /archives/973 61 8.5% 68 7.1% /archives/724 45 6.2% 49 5.1% /archives/779 19 2.6% 21 2.2% /archives/1070 16 2.2% 18 1.9% /archives/1073 14 1.9% 16 1.7% /archives/1063 12 1.7% 15 1.6% /archives/1089 12 1.7% 12 1.2% /archives/1098 [...]