[英]Hbase Sorting efficiency
在我的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
的索引是另一张表,通常以以下三种形式之一出现。
假设V(E)
对于每个实体E
也是唯一的。 那么S
相对于V
的索引是一个表,每行一个实体,其中该表具有行键V(E)
和一个包含K(E)
的列。
要通过V(E)
查找实体E
,只需转到该行以查找K(E)
。
如果您的属性值
V(E)
是唯一的,请使用此方法。考虑一下
Employee
实体表,其中每个员工在公司内都有一个唯一的EmployeeID
K(E)
。 主Employee
表可以使用唯一的EmployeeID
作为行键,而Employee_SSN_Index
可以使用员工的SSN号V(E)
(也是唯一的)。 这可以通过员工的SSN号快速查找员工。
假设V(E)
对于每个实体E
可能不是唯一的; 也就是说,可能有重复项。 那么S
相对于V
的索引是一张表,每行一个实体,其中该表的行键为V(E) ++ K(E)
。
要查找所有实体E
与V(E)
只要做到这一点与开始行的前缀扫描V(E)
V(E)
的长度不固定的情况有一个变体,可能无法区分V(E)
结束和K(E)
开始的点。 可以在行键中的V(E)
和K(E)
之间放置一个分隔符。 例如V(E) ++ "|" ++ K(E)
V(E) ++ "|" ++ K(E)
。 在这种情况下,要扫描的前缀为V(E) ++ "|"
。
Employee_Department_Index
表可以使用员工工作的DepartmentID
作为属性值V(E)
。
假设V(E)
对于每个实体E
可能不是唯一的; 也就是说,可能有重复项。 然后,相对于V
的S
索引是一个表,该表每行具有一组实体,其中该表具有V(E)
的行键和带有限定符K(E)
的列族F
也就是说,实体通过属性值分组为行。
要使用V(E)
查找所有实体E
,请抓取V(E)
行,以请求列族F
中的所有列。
实际上,在索引的每一行中的实体数量很少的情况下,应保持这种方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.