Submitted by gouki on 2012, September 14, 1:46 PM
这是一段时间的我的经历和笔记,看过之前的博客的人应该会看到,我在用mongo,是的,我将大量的数据用mongo存储了,但最终我还是放弃了。理由有很多,不过我还是慢慢列出来吧
1、为什么用mongo
因为当初设计数据库的时候仓促,本来认为只有2~30万的数据,但最终却发现会有200多万条,以后可能还会更加多,所以当初很多大字段都扔在了一个表里,导致如果用in查询,非常慢。所以我想用mongo,扔到内存里查询,看看效果是否会很好。
2、为什么又放弃使用mongo了
说实话,mongo在做关系查询的方面确实挺不错,但存在的问题是我的数据都是用php往mongo里导入,而mongo对于数字和字符串还是认得比较严 的。当然这都不是问题。。问题是现在没有专门的DBA,以后对数据不太容易,也不太方便管理。毕竟目前公司的整体项目,大部分都是用mysql在做处理, 所以,为了配合更多人,才放弃使用mongo(当然,也是为了节约内存)
3、mongo在使用时的优缺点
其实mongo在仅做处理这些条件查询的时候,并没有想象中的那样。当然确实很快,不过在第一次查询的时候还是有点慢的,然后在数据没有变化的时候查询数 据都在0.00x秒,不过,我真的没有太在意(其实有点在意,但因为那个条件也是用mysql生成出来的,再加上查询之前对于那些字段都得做一次强制转 换,否则对于查询的时候可能就出不来数据)
4、最终我怎么做了
既然我已经知道我原来的数据表的问题在哪里,我就想办法处理掉不就完了?于是写了一个脚本,自己将主表的数据中的几个重要的,用来查询和排序的字段拎出来,重建一个表,用来查询,将可变字段改成定长字段,为了提速。这样一来,速度比原来最少快了两个等级。
5、下一步我会怎么做
其实现在做很多事情都是偷懒了,比如对于字段是int型的时候,却还是用的where id = '1',而不是where id = 1;
所以这是后期考虑优化的地方。
当然因为将主要字段分拆成表,所以带来的另一个问题是,当更改原表的时候,需要对新表做更新处理。
6、最后说一下
原表的索引,原来达到了300多M,后来因为把数据迁到新表(做冗余),在新的表建的索引,只有70多M,而且原表因为将索引清除了,编辑和插入的数据又上了一个等级,最终还是觉得这样有优势 。
---PS
不一定要学我,我这也是自己的经历,没有什么可比和可参照性。当然你要骂我那是可以的
Tags: mongo
PHP | 评论:0
| 阅读:15184
Submitted by gouki on 2012, September 14, 1:44 PM
转这篇文章之前,先介绍一下"SEGMENTFAULT(http://segmentfault.com/)",或许国内已经有很多人知道这个网站了,但毕竟它还是一个新站,看趋势是想做成stackflow之类的国内站,他这么说自己的网站:
XML/HTML代码
- 在 Google 搜索技术问题时突然发现从某段时间开始,所有的问题都被指 向 StackOverflow 这个网站了。而且这个网站的问题和答案质量都很高。但是有一点我很烦恼,没有中文,虽然对技术人员来说看懂英文是最基本 的,但是如果能有一个类似的中文问答社区,对于技术的交流是非常有益的。
-
- 因此,我们借鉴了 StackOverflow 的评分机制,搭建了这个网站。最初的想法很简单:我们在搜索技术问题时,能有中文的优质答案出现在搜索结果里。
上原文吧:
问:HTML 格式的邮件如何定义 CSS
内容:
按照写网页的习惯,的把 css 写在 header 里,样式在 Outlook 和 Mail 客户端都能够正常显示。但是,发现在 Gmail 的 Web 界面上,移除了 body 及其外部的所有代码。
Email HTML 如下:
XML/HTML代码
- <!doctype html>
- <head>
- <meta charset="UTF-8" />
- <style type="text/css">
- .title { color: red }
- </style>
- </head>
- <body>
- <h2 class="title">Email title here</h2>
- </body>
- </html>
邮件发出后,在 Gmail 里看到的邮件内容代码只剩下了:
XML/HTML代码
- <h2 class="title">Email title here</h2>
如果想在 Gmail 里正确的显示样式,目前只发现下面的方式才显示正常:
XML/HTML代码
- <h2 style="color: red">Email title here</h2>
难道,整封邮件只能这样实现了么,有别的方法吗?
回答:
1、经过google搜索,发现gmail目前支持inline的css方式。
看来只能悲剧的inline了。
2、国外有篇博客讲了怎样写HTML邮件:<HTML Email Coding 101> http://litmus.com/blog/html-email-cod...
不仅仅是CSS。我看过,写得很好,图文并茂,你可以看看
Tags: segmentfault, typecho
PHP | 评论:0
| 阅读:18344
Submitted by gouki on 2012, August 29, 1:25 PM
在手册里,关于header函数的说明是说服务端会输出一系列的头,用firebug也可以看得很清楚
一般来说,我们用header控制的情况不是特别多,毕竟不会主动去改什么:一般也就设置设置编码、跳转、压缩等,不太会过多的干涉。下载的时候也会设置头,黑黑
手册上,我们对于cache都是写着如何设置,以便让代码不被cache:
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Pragma: no-cache"); // Date in the past
而且在设置的时候还得注意在header前不能有输出,否则header设置无效,但都没有写过,如何给页面设置Cache,虽然我们知道有一些办法,比如 E-TAG之类的。当然也有简单的设置:
比如我们在输出前,对内容进行md5,将它当成e-tag只要没变化,就不会有影响。也有其他的方式:
$seconds_to_cache = 3600;
$ts = gmdate("D, d M Y H:i:s", time() + $seconds_to_cache) . " GMT";
header("Expires: $ts"); header("Pragma: cache");
header("Cache-Control: max-age=$seconds_to_cache");
缓存1小时,主要是过期时间得用gmdate来设置,而不是date,这个要注意,其他都差不多。maxage要和expire能够对得上。
不算笔记的笔记。
Tags: header
PHP | 评论:0
| 阅读:15991
Submitted by gouki on 2012, August 28, 7:36 PM
有时候会用到gzip函数,只是有时候而已。。。
于是。。有些函数就会直接用上了。比如 :gzencode,gzdecode,gzcompress,gzuncompress,gzdeflate,gzinflate
在用的时候。。有些是想当然的。。。比如有Gzencode,就一定会有gzdecode吧?错。。。gzdecode暂时还没有正式版本支持,只存在于svn中,虽然手册上有。。但也说明了不能用
gzcompress与gzdeflate的区别,一个是基于RFC1950协议,一个是基于RFC1951,gzcompress因为是用的1950协议,手册上说了,它需要zlib库。gzdeflate就不需要
所以,gzcompress现在用的相对又少了一点。
好吧,现在说说我的粗心了,大家都知道Gzip压缩是有等级的(压缩软件都有,1~9,1最低压缩,9是最高压缩比),用9的话压缩出来的文件最小,但是解压的时候最耗CPU。所以一般 都是level4,其实就算是1也不错了。
粗心的就在于gzinflate的时候,想当然的将第二个参数length想成level了。结果一直在报错。居然我5分钟后才反应过来。NND,太粗心了。。。
第二个参数是length,不是level啊。
Tags: gzip
PHP | 评论:0
| 阅读:14901
Submitted by gouki on 2012, August 26, 11:09 AM
先申明一下,这个可能不是BUG。只是算起来是实现的方式不一样而已。
场景:我有一个MYSQL数据库,但是现在容量越来越大,主要是因为其中有大字段,多个大字段,所以在查询的时候会特别特别慢。所以想到用mongo来存储一些查询用的结构。单条的时候,我还是准备采用MYSQL。当然其实单条用mongo也合适。不过因为迁移数据有点麻烦,所以还是先忍忍,一步一步来。
测试阶段:因为MYSQL to MONGO有点小麻烦,没有现成的工具。官方说有mongoimport,我看过了,确实OK,但是只支持一些基础的结构,比如:json,csv等。其他的则需要第三方工具。但我自己先在测试中,所以就直接写了个脚本,先将数据用AR取出来。然后插入到mongo中。结果发现,在排序的时候。。9999比10000还大。问了一下神仙 ,他说这应该是按字符串排序的方式来做的。
于是做了一个测试,写进了一个数字,果然就对了。。难道是yii的AR的BUG?想想这不太应该啊。于是我写了一个小的Demo:
PHP代码
- $db = mysql_connect("localhost","root","123456");
- mysql_select_db("feed");
- $query = mysql_query("select id from feeds_group limit 1");
- while($rs = mysql_fetch_array($query)){
- $result = $rs;
- echo "<pre>";
- var_dump($result);
- echo "</pre>";
- }
- echo "<hr />";
- $dsn = 'mysql:host=localhost;dbname=feed';
- $user = 'root';
- $password = '123456';
- $dbh = new PDO($dsn, $user, $password);
- $sth = $dbh->prepare("select id from feeds_group limit 1");
- $sth->execute();
- $result = $sth->fetchAll();
- echo "<pre>";
- var_dump($result);
- echo "</pre>";
打印出来一看:
XML/HTML代码
- array(2) {
- [0]=>
- string(1) "1"
- ["id"]=>
- string(1) "1"
- }
-
- array(1) {
- [0]=>
- array(2) {
- ["id"]=>
- string(1) "1"
- [0]=>
- string(1) "1"
- }
- }
果然出来就是字符串了,最后只能自己在插到mongo的时候写了一个小函数,对于数值型字段做了转换,问题就这样解决了。
Tags: yii, mongodb, mysql, string
PHP | 评论:1
| 阅读:19155