在我的Hbasetable中,我在第100行和第4000行有员工姓名“Simon”,我有另一名同名“Simon”的员工。现在我希望从员工表中获取名为“Simon”的所有员工。行键是每个员工的SSN。
我的问题是,如果我触发查询以获得名为“Simon”的所有员工.Hbase中的搜索效率如何。因为第一个名字“simon”在第100行,第二个“simon”名称在4000.为了获得名称为“simon”的雇员,hbase必须遍历所有表格以找出这个名称。我们将如何高效搜索在这种情况下正在进行全表扫描?
答案 0 :(得分:0)
如果你必须进行全表扫描 - 你做了 - 这不是一个很好的解决方案。事实上,如果你有很多行,那将是一个糟糕的解决方案。
大多数关系数据库管理系统(或“SQL数据库”)为解决此问题所做的是创建索引。由于您使用的是“NoSQL数据库”,因此它不会自动为您创建索引。
让我们看一下如何手动创建索引,以便有效地适应特定类型的查询。
假设您有一组实体S
,其中E
中的每个实体S
都有一个唯一键K(E)
和一个属性值V(E)
。进一步假设您的实体位于HBase表中,每行一个,K(E)
作为每个实体E
的行键。
S
相对于V
的索引是另一个通常以三种形式之一呈现的表格。
假设V(E)
对每个实体E
也是唯一的。然后S
相对于V
的索引是一个表,每行有一个实体,其中表有行键V(E)
,列包含{{ 1}}。
要按K(E)
查找实体E
,只需转到该行即可查找V(E)
。
如果属性值
K(E)
是唯一的,请使用此方法。考虑一个
V(E)
个实体的表格,其中每个员工在公司内都有一个唯一的Employee
,EmployeeID
。主K(E)
表可以使用唯一Employee
作为行键,EmployeeID
可以使用员工SSN号Employee_SSN_Index
(也是唯一的)。这样可以通过SSN编号快速查找员工。
假设V(E)
对于每个实体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) ++ "|"
表可以使用员工所在的Employee_Department_Index
作为属性值DepartmentID
。
假设V(E)
对于每个实体V(E)
可能不是唯一的;也就是说,可能存在重复。然后E
相对于S
的索引是一个每行包含一组实体的表,其中表的行键为V
和列系列V(E)
,其中包含限定符F
。也就是说,实体按属性值分组为行。
要使用K(E)
查找所有实体E
,请抓住请求列系列V(E)
中所有列的行V(E)
。
这种方法应该保持在索引每行中实体数量很少的情况下。