`

数据库中表散列之杂谈

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

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

 

 

 

 

 

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

 

转:http://blog.csdn.net/xiechao240/article/details/5863596

分享到:
评论

相关推荐

    辛星杂谈之mysql中的数据碎片

    当用户从数据库表中删除数据行时,这些被删除的数据所占用的空间并不会被立即回收利用,而是留作“空白”。如果数据的删除不是一次性完成的,而是分批次进行,那么这些“空白”就可能散布在表的数据文件中,导致数据...

    备份数据库的方法杂谈

    数据库备份是IT领域中至关重要的一个环节,它确保了数据的安全性和可恢复性。本文将深入探讨数据库备份的几种常用方法以及相关问题。 首先,最简单的一种备份方式就是物理复制数据库文件和日志文件。在SQL Server...

    hibernate杂谈

    类似于自定义类型对象,集合类型的自定义映射允许将Java集合中的对象序列化存储为数据库中的一个字符串字段,这样在处理大量数据时可以减少数据库表之间的关联,从而提高效率。 通过这篇文章,读者可以了解到...

    hibernate 杂谈

    在Java开发领域,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表之间的映射关系自动化处理。本篇文章将对Hibernate的一些关键特性进行探讨,包括存取JSON数据的新...

    高并发架构一些技术套路杂谈

    缓存技术是高并发架构中提升性能的重要手段之一,可以显著降低数据库的压力。 - **Memcached**:一种简单高效的内存对象缓存系统,主要用于加速动态Web应用程序,减轻数据库负担。 - **Redis**:提供了丰富的数据...

    程序设计经验杂谈,程序设计,经验杂谈

    在编程世界中,程序设计是一项核心技能,涵盖了多种技术和方法。程序设计经验杂谈涉及到的不仅仅是语法...在"程序设计经验杂谈"的资料中,你将找到更多关于这些话题的深入探讨和实用建议,帮助你在编程旅程中不断成长。

    地产行业杂谈系列之十六:社区增值服务模式初探.pdf

    地产行业杂谈系列之十六:社区增值服务模式初探

    高中政治案例教学杂谈.docx

    高中政治案例教学杂谈.docx

    软件性能测试中的一些经验杂谈

    软件软件性能测试中的一些经验杂谈软件测试1、数据库的规划初期尽可能的建立好规范和数据索引;2、多层嵌套的sql语句,当多次循环查询,sql语句的性能好坏受sql语句的影响是很大的,避免多余的和错误的循环嵌套;3、...

    [sql server]SQL Server2005杂谈(2):公用表表达式(CTE)的递归调用.doc

    "SQL Server 2005 杂谈:公用表表达式(CTE)的递归调用" 本文主要介绍了 SQL Server 2005 中公用表表达式(CTE)的递归调用,用于解决树型结构数据的查询问题。CTE 是 SQL Server 2005 中的一种新的查询方式,它...

    为己杂谈学习精要.doc

    本文档《为己杂谈学习精要.doc》主要探讨了个人修养、企业文化、管理理念以及如何在职业生涯中找到良好发展平台的主题。作者引用了老子的哲学思想,并结合《论语》中的教诲,阐述了一种既考虑个人利益又兼顾他人和...

    高中历史之教学教研历史巧记系列之58杂谈历史联想记忆法素材

    高中历史之教学教研历史巧记系列之58杂谈历史联想记忆法素材

    [sql server] SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL

    SQL Server 2005 中使用公用表表达式(CTE)简化嵌套 SQL SQL Server 2005 中的公用表表达式(CTE)是一种强大的工具,可以简化嵌套的 SQL 语句,提高代码的可维护性和性能。本文将介绍 CTE 的基本概念、语法和使用...

    地产杂谈系列之二十三:他山之石:楼市危机下日本房企破局之道(2021)(12页).pdf

    地产杂谈系列之二十三:他山之石:楼市危机下日本房企破局之道(2021)(12页).pdf

    MSSQL基本技能篇--入门篇十章(公众号 HIT杂谈).pdf

    SQL基本语法之“增”涉及如何向表中插入新数据;“删”涉及删除表中的数据;“改”涉及更新表中的数据;“查”则是从表中检索数据。SQL语法还包含了连接(join)的概念,用于从多个表中组合数据,如内连接(inner ...

    SAP FICO重要表及字段手册

    在SAP FICO中,数据被存储在各种表中,这些表中包含了许多字段,用于记录和处理财务信息。 SAP FICO模块中的重要表和字段是进行财务配置和操作的基础。以下是SAP FICO中一些非常关键的表以及它们包含的重要字段: ...

    地产杂谈系列之六:从主流房企对比观龙湖高估值之谜.pdf

    报告还指出,龙湖之所以获得市场的高估值,与其在房地产开发业务中的稳健表现及在多元化业务上的领先布局密切相关。房地产行业已进入总量稳定、微利时代,这意味着对企业综合能力的考验更加严峻。龙湖集团通过聚焦一...

    高并发场景杂谈.zip

    这可能包括使用索引优化数据库查询,避免全表扫描;采用缓存策略,预先计算和存储常用结果;使用数据库的分区和并行查询功能,提升查询性能;或者利用搜索引擎如Elasticsearch进行全文搜索和数据分析。 总结来说,...

    ERP实施杂谈ERP实施杂谈.doc

    ERP实施杂谈ERP实施杂谈

Global site tag (gtag.js) - Google Analytics