Submitted by gouki on 2012, December 28, 9:44 AM
这是昨天SAE分享的一篇文章,开始的时候,我看了一遍,发现好象没有什么特别的内容,但再仔细看的时候,发现居然可以这样做。。。
问题描述:
我们要访问的表是一个非常大的表,四千万条记录,id是主键,program_id上建了索引。
执行一条SQL:
select * from program_access_log where program_id between 1 and 4000
这条SQL非常慢。我们原以为处理记录太多的原因,所以加了id限制,一次只读五十万条记录
select * from program_access_log where id between 1 and 500000 and program_id between 1 and 4000
但是这条SQL仍然很慢,速度比上面一条几乎没有提升。Mysql处理50万条记录的表,条件字段还建了索引,这条语句应该是瞬间完成的。
问题分析:
这张表大约容量30G,数据库服务器内存16G,无法一次载入。就是这个造成了问题。
这条SQL有两个条件,ID一到五十万和Program_id一到四千,因为program_id范围小得多,mysql选择它做为主要索引。
先通过索引文件找出了所有program_id在1到4000范围里所有的id,这个过程非常快。
接下来要通过这些id找出表里的记录,由于这些id是离散的,所以mysql对这个表的访问不是顺序读取。
而这个表又非常大,无法一次装入内存,所以每访问一条记录mysql都要重新在磁盘上定位并把附近的记录都载入内存,大量的IO操作导致了速度的下降。
问题解决方案:
1. 以program_id为条件对表进行分区
2. 分表处理,每张表的大小不超过内存的大小
然而,服务器用的是mysql5.0,不支持分区,而且这个表是公共表,无法在不影响其它项目的条件下修改表的结构。所以我们采取了第三种办法:
select * from program_access_log where id between 1 and 500000 and program_id between 1 and 15000000
现在program_id的范围远大于id的范围,id被当做主要索引进行查找,由于id是主键,所以查找的是连续50万条记录,速度和访问一个50万条记录的表基本一样
总结:
这是一个在千万笔记录表中由于使用了索引导致了数据查找变慢的问题,有一定的典型性和大家交流下!
-----------
看我标红的那一段,原来还能够这样做,以前真的没有注意过,也从来没有想过,先利用主键做一次过滤。这样效率会好很多啊
上述内容来自:http://ourmysql.com/archives/108?f=wb,该网站还有很多技巧值得一看。
Tags: sae, mysql, 索引
DataBase | 评论:2
| 阅读:16883
Submitted by akuma on 2012, July 26, 2:19 PM
修复HTML页面,以前一直用的是tidy庫,但SAE上其實是無法使用的
所以,我選擇了htmlPurifier庫,不過如果直接使用的話,是會報錯的,因為HtmlPurifier默認在修復頁面的時候會使用緩存,這樣可以加快速度。因此代碼就變成了這樣
PHP代码
- $htmlPurifier = new HTMLPurifier(array(
- 'AutoFormat.AutoParagraph' => TRUE,
- 'HTML.TidyLevel' => 'medium',
- 'Cache.DefinitionImpl' => NULL,
- ));
本来,我是将Cache.DefinitionImpl设置为SAE_TMP_PATH的,但HTMLPurifier中会chmod这个目录的权限,而tmppath是无法设置权限的,因此我干脆设置为NULL。
这样一来,问题就解决了。哈哈
Tags: sae, tidy
PHP | 评论:0
| 阅读:16407
Submitted by gouki on 2012, May 14, 9:10 AM
在微博的#SAE技术分享# 看到一些有意思的东西,比如这一篇的标题,嗯,确实是有一些奇怪的玩意。
比如,ubuntu下的apt-get moo,居然出来了这样的玩意,你能相信吗?》
XML/HTML代码
- root@webserver:/# apt-get moo
- (__)
- (oo)
- /------\/
- / | ||
- * /\---/\
- ~~ ~~
- ...."Have you mooed today?"...
好一只羊?还有一些其他的命令,比如yes,好象记得这个命令是专门用来处理自动化安装的吧?即自动输入y,N个,直到安装完成,如果没有安装,就在屏幕上拼命的输出。。。
还有一些其他的。。比如banner,会将你输入的字符用##打印出来,比如我这个:
XML/HTML代码
- root@webserver:/# banner bannertest
-
- ##### ## # # # # ###### #####
- # # # # ## # ## # # # #
- ##### # # # # # # # # ##### # #
- # # ###### # # # # # # # #####
- # # # # # ## # ## # # #
- ##### # # # # # # ###### # #
,再比如fortune,这个函数很有意思,既能学英文又可以很好玩,该网页上这么显示了:
XML/HTML代码
- orange@orange-desktop:~$ fortune
- Q:How many IBM types does it take to change a light bulb?
- A:Fifteen. One to do it, and fourteen to write document number
- GC7500439-0001, Multitasking Incandescent Source System Facility,
- of which 10% of the pages state only "This page intentionally
- left blank", and 20% of the definitions are of the form "A:.....
- consists of sequences of non-blank characters separated by blanks".
想看更多?到这里看一下吧:http://www.linuxidc.com/Linux/2007-05/3784.htm,不是每个linuxer都是闷瓜。
Tags: sae, ubuntu, linux
Linux | 评论:0
| 阅读:17072
Submitted by gouki on 2012, May 3, 8:58 AM
折腾完后yiiforsae后又开始折腾yiiforACE了,只是ACE相对还是比较痛苦的。毕竟ACE的出错直接就提示一句:
XML/HTML代码
- The page you are looking for is temporarily unavailable.
- Please try again later.
然后什么信息都没有了,根本 没有办法定位程序错在哪里。这让我很是纠结,但没有办法,一点点的来吧,感觉ACE的速度挺快。而且有1G的数据库。256M的memcache。只是rewrite怎么办呢?
苦
Tags: sae, ace
PHP | 评论:0
| 阅读:13978
Submitted by gouki on 2012, January 17, 8:59 AM
号码小助手,会自动将号码分析成:AAAB,AABB,ABAB之类的方式。
调用方式:http://ixyz.sinaapp.com/api/phone?h=13912341234,13912123344,13912345678&type=json
默认返回值是json,可支持json,xml,text三种返回形式
号码最多一次传10个
PHPCODE:
esult = file_get_contents('http://ixyz.sinaapp.com/api/phone?h=13912341234,13912123344,13912345678&type=json');
返回值是:
json格式返回:
{"phones":{"13912341234":["ABCD","ABCDABCD"],"13912123344":["ABCD","ABCDABCD","AABB","ABCD","ABAB"],"13912345678":["ABCD","ABCDABCD","AABB","ABCD","ABAB","ABCD"]},"copyright":"Written by walkerlee, api support by gouki","error":"sorry,phone doesn't match"}
xml格式返回:
XML/HTML代码【xml返回的格式结果与json的有一点点不太一样】
- <?xml version='1.0' encoding='UTF-8'?>
- <root>
- <result>
- <phones>
- <phone number="13912341234">
- <ABCD>ABCD</ABCD>
- <ABCDABCD>ABCDABCD</ABCDABCD>
- </phone>
- <phone number="13912123344">
- <ABCD>ABCD</ABCD>
- <AABB>AABB</AABB>
- <ABAB>ABAB</ABAB>
- </phone>
- <phone number="13912345678">
- <ABCD>ABCD</ABCD>
- </phone>
- </phones>
- <copyright><![CDATA[Written by walkerlee, api support by gouki]]></copyright>
- </result>
- </root>
----------
目前支持的类型有:XML/HTML代码
- Array
- (
- [0] => AABB
- [1] => ABCD
- [2] => AAAB
- [3] => ABAB
- [4] => ABCABC
- [5] => ABCDABCD
- [6] => ABBB
- [7] => ABCCBA
- [8] => ABBA
- [9] => AAAA
- [10] => AAAAA
- [11] => AAAAAA
- [12] => AAAAAAA
- [13] => AAAAAAAA
- [14] => ABCDCBA
- [15] => ABCDDCBA
- [16] => ABCBA
- )
---------
以上类型可以根据需要随便加,如果你觉得有哪些规则不错,你可以告诉我(这个正则是自动生成的,因此只要告诉规则就OK了)
嗯,这个程序的核心函数是walkerlee写的,我只是稍稍的封装处理了一下
Tags: sae, php, yii4sae
PHP | 评论:0
| 阅读:14895