数据库中表散列之杂谈

时间:2021-08-19 13:53:46

数据库中的散列法是使用计算值来分配表格数据的方法,它比在整个索引中搜索要好的多。一个哈希散列答应你在数据库表格中存储数据,以便这些行的要害计算的相同值存储在相同的位置。

只有那种数据量超大的数据库才会用到.
表散列与水平分割相似,但没有水平分割那样的明显分割界限, 
它由哈希函数和键值决定一条记录的保存文件,这样是为了IO更加均衡。

水平分区将表分为多个表。每个表包含的列数相同,但是行更少。例如,可以将一个包含十亿行的表水平分区成 12 个表,每个小表表示特定年份内一个月的数据。任何需要特定月份数据的查询只需引用相应月份的表。

而垂直分区则是将原始表分成多个只包含较少列的表。

表散列与水平分割相似,但没有水平分割那样的明显分割界限, 

 

现在要开发一个评论系统,由于考虑到数据量会很大,希望用一个hash算法,把数据分散到多个表中。请大家给一个好的hash算法 

  对hash算法的要求: 
    开始可能只使用3张表存放数据,但以后会扩展到5到10张表,这个hash算法要考虑到增加新的表的情况。 

 

我正好也在研究这个问题哈哈

 

在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,看你使用了什么样的DB,就参考相应的解决方案来实施即可。

 

集群通常会使用CDN与GSBL与DNS负载均衡技术,每个地区一组前台服务器群,例如:网易,百度使用了DNS负载均衡技术,每个频道一组前台服务器,一搜使用了DNS负载技术,所有频道共用一组前台服务器集群。

网站使用基于Linux集群的负载均衡,失败恢复,包括应用服务器和数据库服务器,基于linux-ha的服务状态检测及高可用化。

应用服务器集群可以采用apache+tomcat集群和weblogic集群等;web服务器集群可以用反向代理,也可以用NAT的方式,或者多域名解析都可以;Squid也可以,方法很多,可以根据情况选择。

 

 

上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。

 

 

 

数据库中的散列法是使用计算值来分配表格数据的方法,它比在整个索引中搜索要好的多。一个哈希散列允许你在数据库表格中存储数据,以便这些行的关键计算的相同值存储在相同的位置。
  
  为了在哈希散列中找到一个行,查询机应用哈希函数到一个行的关键值,然后分配和那个值相关的数据块。在很多情况下,一个哈希散列比一个普通的索引快。
  
  Oracle在Oracle 7面世的时候就支持哈希散列。哈希散列的优势仅仅在于当表格的访问在关键值上首先使用的是=操作符,这个表格是静态的,并且仅仅当数据行需要的时候。当和一个普通非索引或者散列表格比较的时候,全表扫描就会变慢。
  
  比如,假设你想要创建一个表格来查找英语单词的发音。你需要迅速的分配一个英语单词的发音,但是一个字典,比如cmudict0.3有大概106,000个单词。
  
  创建哈希散列最大的工作任务就是分析参数。你需要计算分析每个散列的带和散列关键字包含的内容数量。如果三类是正整数,那么你可以设置最小值的大小如果你需要定义自己哈希函数。
  
  对于任何其他类型的数据,比如下面这个列子,你需要计算参数的最小大小。你可以通过使用DBMS_UTILITY.GET_HASH_VALUE函数来获得一个确切的估计。
  
  create table cmudict
  (
    word varchar2(22) primary key,
    pron varchar2(62)
  ); 
  
  使用其他的快速装入程序比如SQL*来装入这些数据:
  
  select max(blksize)
    from (select sum(3+nvl(vsize(word),0)+1+nvl(vsize(pron),0)+1) blksize
          from cmudict group by dbms_utility.get_hash_value(word,1,10007)) blkqry; 
  
  NVL(VSIZE(col),0)+1表达式使用每个栏来分析字节的数字。3+是行的开销,所以表达式的总和是存储每个行所需要的大小。在每个哈希函数组中,求和行的大小,我们获得每个散列数据块所许哟啊的字节数量。1是真的不切实际,但是10007,一个质数,是对哈希关键字参数的最好猜测。
  
  增加或者减少这个值到另外一个质数知道上面的分析结果降低数据块大小的重要性。这些数字,分析的结果和GET_HASH_VALUE的第三个参数应该被使用来创造散列。
  
  现在你可以创造一个散列并使用这个散列存储数据再创建一个表格。
  
  create cluster cmudict_cluster (word varchar2(22))
    size 6000
    single table
    hashkeys 739;
  create table cmudict
  (
    word varchar2(22) not null,
    pron varchar2(62)
  )
  cluster cmudict_cluster(word); 
  
  如果你需要分析这个散列:
  
  analyze cluster cmudict_cluster compute statistics;
  select * from user_clusters where cluster_name = 'CMUDICT_CLUSTER';
  
  你可以看到AVG_BLOCKS_PER_KEY 是 1.
  
  可以为查询语句做注解select * from cmudict where word = 'HELLO' returns:
  
  SELECT STATEMENT
   TABLE ACCESS HASH
  CMUDICT

 

 

 

 

 

数据库中的散列法是使用计算值来分配表格数据的方法,它比在整个索引中搜索要好的多。一个哈希散列答应你在数据库表格中存储数据,以便这些行的要害计算的相同值存储在相同的位置。
只有那种数据量超大的数据库才会用到