跟着ArthurXF学习搜索引擎理论——高速搜索理论
2008/06/12 18:40 ArthurXF
最近本人忙着完善ArthurXF建站框架的开源设计及PHP培训,很长时间未更新blog了,再这里对支持本人的朋友们表示抱歉,因为一直在写框架高速缓存,就有学生问我,google,baidu是用什么数据库做的?为什么那么大的数据量可以搜索的那么快呢?
在这里,我就和大家分享一下,我对搜索引擎的理解,仅仅是我的猜想,如有不对的地方,还望他人多多指点。
其实搜索引擎那么快速的反应,是任何一个数据库都做不到的。因为搜索引擎的数据是海量的,我们先举例搜索关键字mp3,在google里面有13亿的网页,搜索用时 0.04 秒,其实没有哪个数据库可以13亿条记录里面搜索结果出来只需要0.04秒,那么google是怎么做到的呢?
看完了上面的理论,其实我们可以很自豪的对投资人说,只要你跟我足够的钱(买服务器占了大部分,呵呵),我也可以做搜索引擎!
如何建立数据库结果集缓存?我正在写一个轻量级的数据库结果集缓存系统整合在我的ArthurXF网站系统里面,希望学习的朋友们到时可以下载来看看,多多指导!
在这里,我就和大家分享一下,我对搜索引擎的理解,仅仅是我的猜想,如有不对的地方,还望他人多多指点。
其实搜索引擎那么快速的反应,是任何一个数据库都做不到的。因为搜索引擎的数据是海量的,我们先举例搜索关键字mp3,在google里面有13亿的网页,搜索用时 0.04 秒,其实没有哪个数据库可以13亿条记录里面搜索结果出来只需要0.04秒,那么google是怎么做到的呢?
引用
其实我们用mysql都可以做出一个google来,因为大家所访问的搜索结果页面都是数据库结果集的缓存,怎么理解这个问题呢?我来举例说明。
我们假设在mysql数据库中从13亿条数据中搜索mp3关键字,需要耗时1分钟,那么做为用户的我们是无法忍受的,那么我们如何来改善这个结果呢?我们就要设计数据库结果集缓存了,也就是第一个人搜索的时候去数据库查找搜索结果,之后建立数据库结果集缓存,在规定时间内,如果还有人搜索mp3的,就直接将数据库结果集中的数据返回给用户,而不再搜索数据库了,这样就大大提高了用户的访问速度,一般可以把速度提升到小于1秒!过了规定时间以后重新建立数据库结果集缓存就可以更新结果列表了。
那么为什么我们没人碰到搜索非常慢的情况呢?也就是说为什么我不会成为第一个搜索的某个关键字的人呢?
其实非常简单,我们访问google,baidu的时候,我们只能访问到数据库结果集缓存,其实我们根本就访问不到搜索引擎的数据库。这样就可以保证每个人使用搜索引擎的时候,速度都很快!
那么搜索引擎的数据库结果集缓存怎么更新呢?也就是我们看到的数据库排列结果如何变化呢?
其实搜索引擎会根据大家搜索关键字的频率,从高到低来用机器人(程序)自动搜索数据库,建立或更新数据库结果集缓存,这样更新,即时数据库耗时5分钟才产生结果集,也不会有人投诉太慢的,呵呵。当用户再搜索相同的关键字时,就发现结果排列发生变化了。为了应对全球搜索的反应,所以google会在全球建立3大数据中心,共投入了45万台服务器,一些做抓取,一些更新缓存,一些做用户服务的。因为每个数据中心缓存更新的时间并不同步,所以才会发生google dance的现象。如何验证这个理论,你可以对比一个高频关键字和一个低频关键字的更新时间,你会发现高频关键字搜索结果更新速度远远超过低频关键字。
那么搜索结果有13亿,是不是需要建立庞大的数据库结果集缓存呢?如果有上亿的关键词那么不是需要非常多硬盘空间?
其实不管搜索结果有多少,数据库结果集缓存只会建立最高频率搜索的结果集,也就是每个搜索关键字的结果集有个最大页数,大家都知道,搜索结果列表访问最多的就是列表的前3页,但是又不能保证没有人会翻几十页,所以为了验证我的理论,测试结果表明baidu结果集缓存了76页,之后的结果会告诉你“提示:限于网页篇幅,部分结果未予显示。”,google的结果集缓存了100页,其实真的有人能翻页翻到100页的,恐怕也真是凤麟毛角了。那么就算每一页的缓存结果为2K,100页就是200K,看来需要一个海量的磁盘阵列来存储数据库结果集缓存是不可避免的。
那么众多的关键字,搜索引擎怎么知道应该建立哪写关键字的数据库结果集缓存呢?万一建立的关键字的数据库结果集缓存根本就没人查询那不是不很浪费硬盘空间?如何做好协调,既要合理使用硬盘空间,又要满足用户?
其实这个问题也不难解决,一定要建立关键字库,不断更新用户使用的关键字,并且记录关键字查询的次数,如果是一个从来没人用过的关键字,或者认为没必要建立缓存集的关键字,搜索引擎都会告诉你,找不到和您的查询 "kkdnwos" 相符的网页。其实谁能保证这个世界真的没人使用那个关键字呢?肯定有的,只是你查询的关键字还不在搜索引擎的关键字数据库中,只要你每天都搜几次那个关键字,相信再不久的将来,这个关键字会有搜索结果的。呵呵!
我们假设在mysql数据库中从13亿条数据中搜索mp3关键字,需要耗时1分钟,那么做为用户的我们是无法忍受的,那么我们如何来改善这个结果呢?我们就要设计数据库结果集缓存了,也就是第一个人搜索的时候去数据库查找搜索结果,之后建立数据库结果集缓存,在规定时间内,如果还有人搜索mp3的,就直接将数据库结果集中的数据返回给用户,而不再搜索数据库了,这样就大大提高了用户的访问速度,一般可以把速度提升到小于1秒!过了规定时间以后重新建立数据库结果集缓存就可以更新结果列表了。
那么为什么我们没人碰到搜索非常慢的情况呢?也就是说为什么我不会成为第一个搜索的某个关键字的人呢?
其实非常简单,我们访问google,baidu的时候,我们只能访问到数据库结果集缓存,其实我们根本就访问不到搜索引擎的数据库。这样就可以保证每个人使用搜索引擎的时候,速度都很快!
那么搜索引擎的数据库结果集缓存怎么更新呢?也就是我们看到的数据库排列结果如何变化呢?
其实搜索引擎会根据大家搜索关键字的频率,从高到低来用机器人(程序)自动搜索数据库,建立或更新数据库结果集缓存,这样更新,即时数据库耗时5分钟才产生结果集,也不会有人投诉太慢的,呵呵。当用户再搜索相同的关键字时,就发现结果排列发生变化了。为了应对全球搜索的反应,所以google会在全球建立3大数据中心,共投入了45万台服务器,一些做抓取,一些更新缓存,一些做用户服务的。因为每个数据中心缓存更新的时间并不同步,所以才会发生google dance的现象。如何验证这个理论,你可以对比一个高频关键字和一个低频关键字的更新时间,你会发现高频关键字搜索结果更新速度远远超过低频关键字。
那么搜索结果有13亿,是不是需要建立庞大的数据库结果集缓存呢?如果有上亿的关键词那么不是需要非常多硬盘空间?
其实不管搜索结果有多少,数据库结果集缓存只会建立最高频率搜索的结果集,也就是每个搜索关键字的结果集有个最大页数,大家都知道,搜索结果列表访问最多的就是列表的前3页,但是又不能保证没有人会翻几十页,所以为了验证我的理论,测试结果表明baidu结果集缓存了76页,之后的结果会告诉你“提示:限于网页篇幅,部分结果未予显示。”,google的结果集缓存了100页,其实真的有人能翻页翻到100页的,恐怕也真是凤麟毛角了。那么就算每一页的缓存结果为2K,100页就是200K,看来需要一个海量的磁盘阵列来存储数据库结果集缓存是不可避免的。
那么众多的关键字,搜索引擎怎么知道应该建立哪写关键字的数据库结果集缓存呢?万一建立的关键字的数据库结果集缓存根本就没人查询那不是不很浪费硬盘空间?如何做好协调,既要合理使用硬盘空间,又要满足用户?
其实这个问题也不难解决,一定要建立关键字库,不断更新用户使用的关键字,并且记录关键字查询的次数,如果是一个从来没人用过的关键字,或者认为没必要建立缓存集的关键字,搜索引擎都会告诉你,找不到和您的查询 "kkdnwos" 相符的网页。其实谁能保证这个世界真的没人使用那个关键字呢?肯定有的,只是你查询的关键字还不在搜索引擎的关键字数据库中,只要你每天都搜几次那个关键字,相信再不久的将来,这个关键字会有搜索结果的。呵呵!
看完了上面的理论,其实我们可以很自豪的对投资人说,只要你跟我足够的钱(买服务器占了大部分,呵呵),我也可以做搜索引擎!
如何建立数据库结果集缓存?我正在写一个轻量级的数据库结果集缓存系统整合在我的ArthurXF网站系统里面,希望学习的朋友们到时可以下载来看看,多多指导!
引用
另外本人还在搞php实习培训,到我公司跟着项目一边学习一边实践,全程指导使用本人设计的ArthurXF建站系统快速建站。有意向的朋友,可以跟我公司的小姑娘联系。QQ:272209362。