2

在研究面向列的数据库时,我多次阅读“主键是数据”。(例如,在面向列的 DBMS中)

我认为我可以按值随机访问任何单元格(在某个列中),因为值(数据)已经被索引为主键。

但是在我将超过 3M 行放入 HBase 后,HBase shell 命令

scan 'lottery', {COLUMNS => 'cf:status', FILTER => "ValueFilter(=, 'binary:win')"}

超过3秒...

(随着越来越多的行被放置,它变得越来越慢......)

'win'or'lose'是该列的两个可能值,cf:status并且只有 1 行的值为'win'.

我可能误会了...

面向列的数据库中的“主键是数据”是什么意思?

谢谢你。

4

1 回答 1

1

为了能够使用 HBase 快速找到某些内容,它需要是rowkey的前缀。因此,在构建速度时,行键设计非常重要。对于您的情况,您可以使用这些值'lottery_win''lottery_lose'在每一行的行键的开头。这将使查询scan 'lottery_win'查询非常快(亚秒级),即使有数千亿行。

HBase 中的过滤器通常不是很快,因为过滤器会查看与您扫描匹配的每一行。如果您想要速度,让过滤器读取数百万行通常不是一个好主意。

DBMS 中的主键与性能无关。它是对可以放入表中的记录的约束。给出速度的是一个索引。HBase 表只有一个索引项——即行键。没有其他列被索引,因此过滤器很慢(每秒数百万行)。

于 2019-09-13T19:50:34.230 回答