4.3. LSQL分区
4.3.1 LSQL分区说明
lsql会强制使用数据分区
分区有点类似数据库的分库分表
lsql的分区字段名为partition
分区并非越多越好
如果不指定分区,lsql默认会去查询default这个分区
partition字段支持=,>=,>,<=,<,like,in等几种分区匹配方式
随着时间的日积月累,单个索引会越来越大,从而导致系统瓶颈。LSQL不会将全部的数据都完整的创建在一个索引中,LSQL会对数据进行分区,分区的方式由用户来定义(如按照日期分区)。lsql的分区有点类似于数据库里的分库分表的概念。
一条数据的分区,在导入的时候直接指定,具体请参考后面的数据导入用法。
如果按照日期进行分区,每天就会生成一个分区,如需查询哪天的数据,就去对应的分区中检索,其他的分区则闲置。
LSQL 的SQL需要通过partition来指定分区;
如果没有指定partition分区的查询,LSQL表默认会去查询 "default" 这个分区。
查询时指定分区例子如下:
partition ='20190928' partition in ('20190928','20190927') partition like '%'
建议查询时使用=或in的方式,>=,>,<=,<的范围指定分区查询效率不高。
4.3.2 分区的数量与粒度
分区数量
如果我们的数据可以按照时间进行切分,是不是切分的越细越好?
很遗憾,LSQL并不适合特别多的分区,分区越多代表索引文件越多,索引文件过多会带来以下问题:
LSQL中打开一个索引是有很大的开销的,打开一个索引加载的列信息、索引的BlockTree相关主干节点等,需要消耗较多的内存,而且要持久化到内存里去维护这个索引的状态。这就是为什么大家会发现,对于一个表第一次查询会比较慢,但是我们进行一次count以后,在进行别的查询就会快很多。
LSQL在一个进程里能够打开的索引数量是有限的,如果超过允许打开的索引文件数量,那么就要关闭一些索引,以保证内存不会OOM。
小文件太多,对HDFS的NameNode的压力较大。
分区粒度
基本分区原则:在避免索引频繁的打开与关闭的情况下,索引粒度越小越好。
- 如果数量不是很大,一年加在一起还不到10亿,就建议采用按年分区。
- 如果数据处于中等,每月的数据增量为1亿左右,建议按照季度分区。
- 如果数据每天写入量特别大,按照月份分区,单个索引太大会造成写入瓶颈,建议按照天进行分区。
很多时候还可以根据不同的查询方式,采用两种粒度的分区:
- 最近几天的数据经常被查询,那么最近几天的数据按照天进行分区
- 但是偶尔也会发生查询整年的数据,如果采用按天分区的话,一次打开的索引太多,那么可以再加一个按照季度的分区。
- 按天的数据分区只保存最近7天的数据,超过7天的数据会通过insert的方式归档到季度的分区里。