云计算设计模式(十二)——索引表模式

云计算设计模式(十二)——索引表模式


创建索引查询条件经常被引用数据存储等领域这种模式可以通过允许应用程序更快速地定位数据从数据存储中检索提高查询性能。

背景和问题


许多数据存储通过使用主键组织实体的集合的数据。应用程序可以使用此键来查找和检索数据图1显示了一个数据存储区保持顾客的信息的例子主键是客户ID

云计算设计模式(十二)——索引表模式

图1  - 按主键组织的客户信息客户ID


主键是该基于该关键字的值的数据的查询宝贵的,应用程序可能能够使用主键是否需要基于其它字段来检索数据顾客例如,应用程序不能使用该客户ID主键来检索客户,如果通过指定引用的一些其他属性的值在其中客户位于标准查询数据完全要执行一个查询,如这可能需要申请获取并检查每一个客户的记录,这可能是一个缓慢的过程

许多关系数据库管理系统支持二级索引一种二次指数由一个或多个非主(辅助)领域举办一个单独的数据结构,它表示,其中每个索引数据被存储第二索引项目通常排序方法第二个键的值,使数据快速查找。这些指标通常是由数据库管理系统自动进行维护

由于需要支持您的应用程序执行不同的查询,您可以创建任意多个二级指标例如,一个关系数据库中凡客ID是主键的的客户可能是有益的补充辅助指数在域如果应用程序频繁查找的客户其居住小镇。

然而,尽管二级指标关系型系统的共同特征使用云应用大部分NoSQL数据存储不提供同等的功能

解决方案


如果数据存储不支持​​二级索引可以通过创建自己的索引表手动效仿他们索引表由指定的组织数据三种策略通常用于构建一个索引,这取决于所需要的二次索引的数目应用程序执行的查询的性质
重复数据的每个索引表中,而是由不同的密钥(完全非规范化组织它图2显示了索引表组织包括城市和姓氏相同的客户信息

云计算设计模式(十二)——索引表模式

图2 - 索引执行二级指标客户数据数据被复制到每个索引


如果比较时候,它是通过使用每个键查询的数目数据是相对静态的这一策略可能是适当的如果数据是更加动态保持每个索引表的处理开销可能会变得太大,这种方法是有用的。此外,如果数据量非常大,空间来存储重复的数据所需要的量将显著

•创建不同的密钥组织的索引表和通过使用主键而不是重复引用原始数据示于图3的原始数据被称为一个事实表

云计算设计模式(十二)——索引表模式

图3 - 索引执行二级指标客户数据数据是由每个索引表所引用


这种技术可以节省空间,降低了维护的重复数据的开销。缺点是,一个应用程序具有通过使用第二密钥执行两个查找操作以查找数据找到的主键索引表中数据,然后查找在事实表中的数据通过使用主键)。

•创建重复的频繁检索的字段不同的按键组织的部分索引表引用原始数据来访问较少频繁访问的字段。图4示出了这种结构。

云计算设计模式(十二)——索引表模式

图4 - 索引执行二级指标客户数据经常访问的数据是重复的每个索引


使用这种技术,你可以前两种方法之间取得平衡可以快速地检索到通过使用单个查找,常用的查询数据,而空间维护开销一样大,复制整个数据集


如果应用程序通过指定值的组合频繁地查询数据(例如,“查找生活在雷德蒙具有史密斯所有客户,则可以实现索引表中的项目作为一个级联城市属性姓氏属性示于图5中的键排序,然后通过名字为那些具有相同的值的记录。

云计算设计模式(十二)——索引表模式

图5 - 基于复合主键索引表


索引表可以加快分片的数据查询操作在那里碎片密钥散列特别有用图6显示了一个示例,其中分片密钥客户ID的散列。索引表可以散列城市和名字组织数据提供哈希分片作为查找数据这样可以节省重复计算散列键应用(其可以是昂贵的操作,如果它需要检索的数据落在一个范围之内或者它需要读取的数据,以便散列密钥例如诸如“查找生活在雷德蒙所有客户可以通过定位在索引表中的匹配(其全部存储在一个连续的并按照引用客户数据尽快解决的查询使用存储在索引表中碎片的键。

云计算设计模式(十二)——索引表模式

图6  - 索引表中提供了快速查找分片数据

问题和注意事项


在决定如何实现这个模式时,请考虑以下几点
保持辅助索引开销可能是显著你必须分析和了解,您的应用程序使用查询。创建他们很可能被经常使用的索引表。不要投机创建索引的表,以支持应用程序不执行查询或者一个应用程序只执行非常偶然
在索引表中复制的数据所用存储成本维护数据的多个副本所需的工作条件添加显著开销。
•执行一个索引,作为标准化的结构,引用原始数据可能需要的应用程序,以执行两个查找操作以查找数据第一操作搜索索引来检索主键,第二个使用的主密钥来获取数据
•如果系统包含大量索引表非常大的数据集,也可以是难以维持索引表和原始数据之间的一致性。有可能设计围绕最终一致性模型应用例如插入,更新或删除数据一个应用程序可以发送一条消息一个队列,并让一个独立的任务执行操作维护引用该数据不同步索引表。有关实现最终一致性的更多信息,请参阅数据一致性底漆。


注意:

微软Azure存储表支持事务更新同一个分区中保存的数据进行更改(简称实体组的事务如果你可以存储一个事实表和在同一个分区的一个或多个索引表中的数据您可以使用此功能来帮助确保一致性


•索引表可以自行进行分区或分片

何时使用这个模式


使用这种模式来提高查询性能,当应用程序经常需要使用一键以外的主(或子库来检索数据

这种模式可能不适合
数据是不稳定的索引表可能变得过时速度非常快,使其无效,或者使保持在索引表大于制成的任何节省的开销。
选作索引表中的二级密钥的场非常不鉴别,只能有一个小的值的集合(例如,性别)
数据值的选择为一个索引表中的二级密钥的场平衡高度倾斜例如,如果90%的记录中包含相同的值的一个字段,然后创建和维护一个索引中查找基于该字段中的数据可以施加更大的开销比通过数据扫描顺序然而,如果查询非常频繁地针对位于对剩余的10%的值该索引可以是有用的。你必须明白的疑问,您的应用程序正在执行以及如何他们经常执行

例子


Azure存储在云中运行的应用程序提供了一个高度可扩展的键/值数据存储应用程序存储,并通过指定一个检索数据值的数据值可以包含多个字段,但一个数据项的结构是不透明的存储,这仅仅处理一个数据项作为一个字节数组

Azure存储还支持分片分片密钥包括两个元件一个分区键行密钥有相同的分区的数据项都存储在同一分区(碎片),并且项目被存储在一个子库顺序表存储优化用于执行获取数据下降分区中的连续范围键值范围内的查询。如果您正在构建存储Azure的表的信息的云应用应该组织你的数据在考虑这个功能

例如,考虑存储有关电影的信息的应用程序应用程序经常按流派查询电影(动作片,纪录片历史喜剧戏剧等等可以通过使用类型作为分区并指定电影的名称作为行密钥创建一个天青的分区的每个类型如图7

 

云计算设计模式(十二)——索引表模式

图7  - 存储在Azure Table中的电影数据按流派划分排序的电影名称


这种方法不太有效,如果该应用程序还需要通过演员主演查询电影。在这种情况下可以创建一个单独的Azure作为一个索引表分区键是演员和行关键是电影的名字对于每个演员的数据将被存储在单独的分区。如果一个电影明星不止一个演员,同一部电影出现多个分区

可以通过采用上面的解决方案部分中所述的第一种方式重复每个分区中保存的值电影数据然而很可能是每个影片将(对于每个演员一次)重复几次所以它可能是更有效的,以部分非规范化,以支持最常见的查询(如其他演员的姓名数据,并实现一个应用程序包括必要找到在体裁分区完整信息,分区键来检索任何剩余的细节这种方法是通过在解决方案部分中的第三项中的说明图8描述了这种方法。

云计算设计模式(十二)——索引表模式

图8  - 演员分区作为索引表影像数据

本文翻译自MSDN:http://msdn.microsoft.com/en-us/library/dn589791.aspx

上一篇:JavaEE Hibernate使用


下一篇:使用c语言计算3阶行列式