在我的Hbasetable中,在第100行的员工名为“Simon”,在第4000行的员工名为“Simon”。现在,我想从Employee表中获取所有名称为“Simon”的员工。行键是每个员工的SSN。
我的问题是,如果我触发查询以获取所有名称为“Simon”的员工。Hbase的搜索效率如何?因为第一个名称“simon”在第100行中,第二个“simon”名称在4000行中。要获得名为“simon”的员工,hbase必须遍历所有表才能找到该名称。搜索效率如何,因为我们在这种情况下正在做全表扫描?
最佳答案
如果您必须进行全表扫描(您需要这样做),那将不是一个很好的解决方案。实际上,如果您有很多行,这将是一个糟糕的解决方案。
大多数关系数据库管理系统(或“SQL数据库”)为解决此问题所做的工作是创建索引。由于您使用的是“NoSQL数据库”,因此它不会自动为您创建索引。
让我们看一下如何手动创建索引,以便有效地容纳特定类型的查询。
假设您有一个实体S
的集合,其中E
中的每个实体S
具有唯一的键K(E)
和一个属性值V(E)
。进一步假设您的实体位于HBase表中,每行一个,用K(E)
作为每个实体E
的行键。
相对于S
的V
的索引是另一个通常以以下三种形式之一出现的表。
索引表1
假设V(E)
对于每个实体E
也是唯一的。然后S
相对于V
的索引是一个表,每行一个实体,其中该表具有行键V(E)
和一个包含K(E)
的列。
要通过E
查找实体V(E)
,只需转到该行以查找K(E)
。
索引表2
假设V(E)
对于每个实体E
可能不是唯一的;也就是说,可能有重复项。然后S
相对于V
的索引是一个表,每行一个实体,其中该表的行键为V(E) ++ K(E)
。
要使用E
查找所有实体V(E)
,只需对以V(E)
开头的行进行前缀扫描。
索引表3
假设V(E)
对于每个实体E
可能不是唯一的;也就是说,可能有重复项。然后S
相对于V
的索引是一个表,每行具有一组实体,其中该表的行键为V(E)
,列族的F
带有限定符K(E)
。即,实体通过属性值分组为行。
要使用E
查找所有实体V(E)
,请获取V(E)
行,以请求列族F
中的所有列。
关于hadoop - Hbase排序效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24947725/