4.3. LSQL分区

4.3.1 LSQL分区说明

  1. lsql会强制使用数据分区

  2. 分区有点类似数据库的分库分表

  3. lsql的分区字段名为partition

  4. 分区并非越多越好

  5. 如果不指定分区,lsql默认会去查询default这个分区

  6. partition字段支持=,>=,>,<=,<,like,in等几种分区匹配方式

    • 随着时间的日积月累,单个索引会越来越大,从而导致系统瓶颈。LSQL不会将全部的数据都完整的创建在一个索引中,LSQL会对数据进行分区,分区的方式由用户来定义(如按照日期分区)。lsql的分区有点类似于数据库里的分库分表的概念。

    • 一条数据的分区,在导入的时候直接指定,具体请参考后面的数据导入用法。

    • 如果按照日期进行分区,每天就会生成一个分区,如需查询哪天的数据,就去对应的分区中检索,其他的分区则闲置。

    • LSQL 的SQL需要通过partition来指定分区;

    • 如果没有指定partition分区的查询,LSQL表默认会去查询 "default" 这个分区。

      查询时指定分区例子如下:

      partition ='20190928'
      partition in ('20190928','20190927')
      partition like '%'
      

      建议查询时使用=或in的方式,>=,>,<=,<的范围指定分区查询效率不高。

4.3.2 分区的数量与粒度

  1. 分区数量

    如果我们的数据可以按照时间进行切分,是不是切分的越细越好?

    很遗憾,LSQL并不适合特别多的分区,分区越多代表索引文件越多,索引文件过多会带来以下问题:

    • LSQL中打开一个索引是有很大的开销的,打开一个索引加载的列信息、索引的BlockTree相关主干节点等,需要消耗较多的内存,而且要持久化到内存里去维护这个索引的状态。这就是为什么大家会发现,对于一个表第一次查询会比较慢,但是我们进行一次count以后,在进行别的查询就会快很多。

    • LSQL在一个进程里能够打开的索引数量是有限的,如果超过允许打开的索引文件数量,那么就要关闭一些索引,以保证内存不会OOM。

    • 小文件太多,对HDFS的NameNode的压力较大。

  2. 分区粒度

    • 基本分区原则:在避免索引频繁的打开与关闭的情况下,索引粒度越小越好。

      1. 如果数量不是很大,一年加在一起还不到10亿,就建议采用按年分区。
      2. 如果数据处于中等,每月的数据增量为1亿左右,建议按照季度分区。
      3. 如果数据每天写入量特别大,按照月份分区,单个索引太大会造成写入瓶颈,建议按照天进行分区。
    • 很多时候还可以根据不同的查询方式,采用两种粒度的分区:

      1. 最近几天的数据经常被查询,那么最近几天的数据按照天进行分区
      2. 但是偶尔也会发生查询整年的数据,如果采用按天分区的话,一次打开的索引太多,那么可以再加一个按照季度的分区。
      3. 按天的数据分区只保存最近7天的数据,超过7天的数据会通过insert的方式归档到季度的分区里。
Copyright © lucene.xin 2020 all right reserved修改时间: 2021-07-09 10:32:34

results matching ""

    No results matching ""