海量数据的检索,效率是第一位的。由于检索的特殊性,表格的水平分割就变得十分关键了。
由于一直在IBM大型机上做开发,使用的都是DB2这样的巨型数据库,以前数据库分割之类的事情一直没有考虑过,直到自己的网站在面对海量数据,速度明显不给力的时候,才意识到数据库需要分割了。
说到检索,日语的检索,我的构想是拥有一个总检索表格,日语汉字,日语假名,中文汉字,拼音,英语,所有的关键字都放在一张很长很长的表格里面,检索的时候,先从这张表格里面找到单词的序列号。
检索关键字 | 字典编号 | 字典内序列号 |
我们 | 1 | 4567 |
我们 | 3 | 312 |
さくら | 2 | 3213 |
寒い | 5 | 124 |
shanghai | 6 | 22 |
close | 12 | 34 |
meili | 1 | 321 |
geili | 1 | 432 |
这样的表格怎么水平分割:
1.水平分割的依据是什么?
2.水平分割后,这么知道一个词语在那个表格里面?
由于自己的本职工作不是做NET的,所以不知道有Hash化这样的一件事情,在看到下面这篇文章之后,终于找到了解决方法
http://www.cnblogs.com/codebean/archive/2011/06/02/2068768.html#2114864
所谓的Hash化,就是通过MD5加密,把字符串转化为32位的Hash值,这些Hash值都不会重复。
如果以第一位Hash码划分所有的Hash值的话,目测了一下,所有的Hash值的分布比较均匀的。
这样的话,水平分割的大致想法也就产生了:
1.为每个检索关键字生成Hash值。
2.根据Hash值的第一位决定这个关键字放在哪个数据表里面。第一位一共16种可能性【0-F】可以放在4个,8个表中,根据实际情况进行调整。
3.检索的时候,先将检索词语进行Hash化,通过Hash值的第一位来决定接下来的检索在那个数据库里面进行。
在原文的回复里面,有一个热点的问题。就是说虽然所有的单词都是平均分配在各个数据表里面的,但是,由于有些数据的被检索频率异常高,这样就产生了负荷不平衡的问题。具体到单词检索的数据表,就是一些常用词语可能被检索的频率会非常高。我的考虑的方案是,将高检索词语从数据表中抽出来,将这些词语的检索结果,预先保存起来。需要的时候,直接使用即可,就像使用缓存一样使用这些数据。
同时,我想咨询一下大家,如果我把Hash值作为数据库的主键进行使用,这样的方法是不是可行呢?
或者说,我的想法是不是还有什么欠妥当的地方呢?请大家指明方向。。。。
有兴趣的写信给我 root#magicdict.com [convert # to @ ]
或者加MSN mynightelfplayer@hotmail.com