在研究面向列的DB时,我多次阅读了“主键是数据”。 (例如,在Column-oriented DBMS处)
我认为我可以按值随机访问任何单元格(在特定列中),因为值(即数据)已被索引为主键。
但是在我将超过3M行放入HBase之后, HBase shell命令
scan 'lottery', {COLUMNS => 'cf:status', FILTER => "ValueFilter(=, 'binary:win')"}
需要3秒钟以上的时间...
(随着越来越多的行放置,它变得越来越慢...)
'win'
或'lose'
是列cf:status
的两个可能值,并且只有1行的值为'win'
。
我可能会误会...
在面向列的数据库中,“主键是数据”是什么意思?
谢谢。
答案 0 :(得分:1)
要能够使用HBase快速找到某些内容,它必须是行键的前缀。因此,行键设计对于提高速度至关重要。对于您的情况,可以在每行的行键的开头使用值'lottery_win'
或'lottery_lose'
。这将使查询scan 'lottery_win'
的查询速度非常快(不到一秒),即使有数千亿行。
过滤器通常不是很快,因为过滤器会查看与您扫描匹配的每一行。如果要提高速度,通常不建议让过滤器读取数百万行的数据。
DBMS中的主键并不暗示任何有关性能的信息。这是对您可以放入表中的记录的约束。给出速度的是 index 。一个HBase表只有一个索引项-这就是行键。没有其他列被索引,因此过滤器运行缓慢(每秒数百万行)。