如果一个表major_compation的周期是2天,TTL是10天,
假如:
4月15日 12:00 做了major_compaction,4.5之前的过期数据会被物理删除(4.15-4.5=10天)
4月17日 12:00 时还没有做major_compaction(4.17-4.15<=2天),4.5、4.6号的数据已经变成过期数据(4.17-4.5>ttl:10天),但是还没有被物理删除
在这种情况下,有两天数据(4.5,4.6)是过期的,如果4.7-4.17内新产生的有效数据小于caching或limit,scan时相当于告诉服务器找到cahing或limit条才返回,直到到达endkey。如果这时endkey是一个很大的值,服务器会一直扫描到endkey(包括4.5、4.6两天的过期数据)。造成服务器load很高,查询很慢。
所以使用scan接口时:
1.[startkey,endkey)尽量限定在最小范围(如rowkey带时间,要考虑TTL),不能依赖limit或其他方式来在一个很大的[startkey,endkey)范围内scan少量的数据
2.取少量数据时,需要取多少就设置caching为多少