标签:sae

浏览模式: 标准 | 列表 | 图文
Mysql数据库索引查询优化的分享

Mysql数据库索引查询优化的分享

这是昨天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,该网站还有很多技巧值得一看。

在新浪SAE上使用htmlpurifier

在新浪SAE上使用htmlpurifier

修复HTML页面,以前一直用的是tidy庫,但SAE上其實是無法使用的

所以,我選擇了htmlPurifier庫,不過如果直接使用的話,是會報錯的,因為HtmlPurifier默認在修復頁面的時候會使用緩存,這樣可以加快速度。因此代碼就變成了這樣

$htmlPurifier = new HTMLPurifier(array(
'AutoFormat.AutoParagraph' => TRUE,
'HTML.TidyLevel' => 'medium',
'Cache.DefinitionImpl' => NULL,
));

本来,我是将Cache.DefinitionImpl设置为SAE_TMP_PATH的,但HTMLPurifier中会chmod这个目录的权限,而tmppath是无法设置权限的,因此我干脆设置为NULL。

这样一来,问题就解决了。哈哈

Linux命令行下面一个有趣的小命令(tested in ubuntu)

Linux命令行下面一个有趣的小命令(tested in ubuntu)

在微博的#SAE技术分享# 看到一些有意思的东西,比如这一篇的标题,嗯,确实是有一些奇怪的玩意。
比如,ubuntu下的apt-get moo,居然出来了这样的玩意,你能相信吗?》

root@webserver:/# apt-get moo
(__)
(oo)
/------\/
/ | ||
* /\---/\
~~ ~~
...."Have you mooed today?"...

好一只羊?还有一些其他的命令,比如yes,好象记得这个命令是专门用来处理自动化安装的吧?即自动输入y,N个,直到安装完成,如果没有安装,就在屏幕上拼命的输出。。。
还有一些其他的。。比如banner,会将你输入的字符用##打印出来,比如我这个:

root@webserver:/# banner bannertest

##### ## # # # # ###### #####
# # # # ## # ## # # # #
##### # # # # # # # # ##### # #
# # ###### # # # # # # # #####
# # # # # ## # ## # # #
##### # # # # # # ###### # #

,再比如fortune,这个函数很有意思,既能学英文又可以很好玩,该网页上这么显示了:

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都是闷瓜。

折腾ACE

折腾ACE

折腾完后yiiforsae后又开始折腾yiiforACE了,只是ACE相对还是比较痛苦的。毕竟ACE的出错直接就提示一句:

The page you are looking for is temporarily unavailable.
Please try again later.

然后什么信息都没有了,根本 没有办法定位程序错在哪里。这让我很是纠结,但没有办法,一点点的来吧,感觉ACE的速度挺快。而且有1G的数据库。256M的memcache。只是rewrite怎么办呢?
苦

号码小助手

号码小助手

号码小助手,会自动将号码分析成: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 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>
----------
目前支持的类型有:
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写的,我只是稍稍的封装处理了一下

editplus 支持svn了

刚才在看sae的文档时,发现他在介绍如何部署代码时提到了editplus,并说,editplus可以用TSVN来部署文件。
这时候我觉得纳闷,什么时候editplus支持SVN了?
然后找到了editplus的官网,找到了what's new:

原来,从3.30开始就支持了。
不过TSVN必须要先安装小乌龟才OK,HOHO,有兴趣的朋友是可以尝试了。
反正我现在用PHPstorm,什么都带了。
自从用了phpstorm,腰不酸腿不疼了。

Yii for SAE 提交到google code

Yii for SAE 提交到google code

Yii for sae终于提交到了google code了。

yii framework for sina sae platform. 初步实现将yii framework 移植到 sina SAE云平台。 assets目录生成到storage中,runtime则是用memcached来实现, 也因此需要激活storage和memcached。 几乎不需要改原来的代码,如果需要设置主从数据库,请另外加一个components节点:sdb,配置信息与db一样,但需增加一个 'isSlave'=>true,即OK。不过在这种情况下,所有的model都请继承SaeActiveRecord?。

配置信息中,在params里增加 'params'=>array(

'sae'=>array(
'storage' => array(
'assets' => 'assets', 'runtime'=>'runtime',
), 'db'=>array(
'slave'=>'sdb', 'master'=>'db',
)
),

);
----
配置起来是不是很简单?
当前目前还是有一点问题的

  1. 比如对于文件的LOG暂时无法实现,准备使用memcache存储部分,等到了一定大小后,扔到storage中存储。
  2. GII暂时还不能在线上使用,这个有点纠结,因为GII是需要生成文件 ,而sae平台不支持生成文件。如果扔到storage中,效率又不能保存。如果扔到memcache中。include之类的又不知道是否能够完美实现?纠结中。。(生成到storage?然后下载?扔到models目录中?这多没意思,与其这样,还不如本地建好model,然后SVN上传呢)
  3. 好象cdbcache是用了sqlite,原本看代码里是能够自动生成的,但在线上,怎么搞呢?存到storage中又没有效率?哎。。。

不过,暂时基本功能都实现了,嗯项目地址是:http://code.google.com/p/yiiforsae/

Yii for SAE

Yii for SAE

这两天在实现Yii for SAE,之所以想实现这样的功能,主要还是YII相对比较深入开发人员的人心吧?
这一定是我的个人偏见,因此不要打口水仗。
开发的时候,遇到的问题大多是runtime目录下的存储,以及主从数据库的问题,因此大部分的精力都是在解决这些。
所幸,还是可以利用yii的一些特性来搞定它。
嗯。70%已经完成了。如果差不多了,到时候会扔到google code上,这样想用的人就直接可以使用啦。

目前还在测试中,可以访问 http://ixyz.sinaapp.com进行测试。

SAE的升级真TMD扯蛋

SAE的升级真TMD扯蛋

上午登录SAE的时候还是好好的,结果下午再看的时候,发现不能登录了。登录界面就一个,使用微博帐号登录。我晶,怎么搞成这样了?
再看一下首页,居然有老用户必看:http://sae.sina.com.cn/?m=devcenter&a=index&catId=33&content_id=121
内容就是这样的:

即日(5月17日)起,SAE正式对外开放注册。

为答谢各位的支持,用户系统全新改版升级。您只需将帐号关联到微博便可享受升级的畅快与轻松,立即体验~~
点击链接升级: http://sae.sina.com.cn/user/upgrade

注意:可以更换帐号安全认证的手机号,但手机号不能与其他帐号使用的手机号重复,一个手机号只能注册一个帐户

全新升级版SAE具有以下特性:
*增加帐号关联微博功能,一键登录、多渠道快速接收最新最全通知;
*新版SDK 支持代码冲突检测,解决多人多电脑编辑代码相互覆盖的问题;
*新版SDK 支持全局热键。可将更新上传的热键设置为Ctrl+S,这样在编辑器里保存代码的同时即可进行上传哦!

如果您在升级过程中,有任何的疑问和建议,请@SinaAppEngine(http://weibo.com/saet)官方微博反馈给我们。我们会尽快为您答复和解决!
SAE更多精彩,更多体验,敬请期待!感谢大家对SAE的支持!

我靠,这太TMD扯蛋了,比如,不能绑定域名先不说,现在又非要绑定微博帐号,真是觉得所有的人就非得用你的玩意吗?
新浪,请不要强*奸用户的意愿。看来真是做微博做的走火入魔了。

基本实现 phprpc_client For SAE

基本实现 phprpc_client For SAE

自从申请了SAE后,不知道用来干什么 ,于是就有了利用SAE监控网站 ,后来我想应该把PHPRPC移过去吧,于是就开始了简单的移植。由于SAE的【http://wiki.sae.sina.com.cn/doku.php?id=sae%E5%BC%80%E5%8F%91%E8%80%85%E6%89%8B%E5%86%8C#%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E7%AE%80%E4%BB%8B】,所以在移植前要注意,比如没有ini_get,ini_set之类的。而且sae取消了fsockopen远程地址,是改用curl的。因此对于这些也需要改的

经过一个下午的折腾,基本上完成了移植,可以查看:http://nsblog.sinaapp.com/test.php,这是客户端。http://nsblog.sinaapp.com/是服务端。服务端公布两个简单的方法:trim,hello。

大家可以测试一下。(目前还没有测试proxy,加密等其他协议之类的。gzip可以用)

其他协议周一继续测试 ,等稍微稳定后,我会向andot提交代码。