总结:
1.查询时能用rowKey查询尽量使用rowKey查询,这样hbase能最快确定数据在集群中的哪台机器上。
2.Scan.setReversed(true)、Filter.setReversed(true)可以将查询结果反转,但是有些限制:
使用Scan.setStartRow() Scan.setStopRow()时,如果Scan.setReversed(true)会导致查询不到数据。
使用FilterList时,所有的filter的reversed必须相同,否则会报错(Filters in the list must have the same reversed flag, this.reversed=XXX)。
3.Scan.setBatch()指定最多返回的Cell的数量,防止OutofMemory。
4.分页可以使用PageFilter,但是不能获取所有数据的总数量。
5.Filter.setFilterIfMissing()设置该行是否跳过。
6.可以使用SubstringComparator进行模糊查询;对RowKey使用RowFilter&RegexStringComparator进行正则查询;使用RowFilter&BinaryPrefixComparator对RowKey进行前缀查询。
7.按照时间戳查询可以使用Scan.setTimeRange()。
8.对于查询,使用Filter的效率远远低于使用RowKey(数据量越大越明显),设置合理的RowKey很重要,如果可以,尽量充分利用RowKey。
9.Scan.setMaxResultSize()设置的是二进制字节的大小,不是返回的数据的条数。
10.单条查询使用Get速度永远最快。
11.列族名、RowKey越短越好;能用一个列族搞定的就不要用两个列族,浪费空间,而且不方便查询。
暂时这么多,其他后续补充。
沙发
感谢博主、但有的业务需要scan.setReversed 和 withStartRow/withStopRow 一起使用查询不到值、请问这种有解决方法吗?谢谢~
@陈康 呃……我这边没有什么好的办法