
# Doris建表规范
该章节主要介绍创建Doris表时需遵循的规则和建议。
#### Doris建表规则
- 在创建Doris表指定分桶buckets时，每个桶的数据大小应保持在100MB\~3GB之间，最大不超过5GB；单分区中最大分桶数量不超过200，且单个表分区不超过3000，集群中最大表数量不超过5000。
- 表数据超过5亿条以上必须设置分区分桶策略。
- 创建Doris表时，单个数据库下建议不要超过1000张表，表多情况需要在多个数据库中创建。
- 表的分桶列不要设置太多，一般情况下设置1或2个列即可，同时需要兼顾数据分布均匀和查询吞吐均衡。
  - 数据均匀是为了避免某些桶的数据存在倾斜影响数据均衡和查询效率。
  
  - 查询吞吐利用查询SQL的分桶剪裁优化避免了全桶扫描，以提升查询性能。
  
  - 分桶列的选取：优先考虑数据较为均匀且常用于查询条件的列作为分桶列。 可使用以下方法分析是否会导致数据倾斜：
    **SELECT a, b, COUNT(\*) FROM tab GROUP BY a,b;**
    命令执行后查看各个分组的数据条数是否相差不大，如果相差超过2/3或1/2，则需要重新选择分桶字段。
    
   
- 2千万以内数据禁止使用动态分区。动态分区会自动创建分区，而小表用户关注不到，会创建出大量不使用的分区分桶。
- 创建表时，排序键key不能太多，一般建议3\~5个；太多key会导致数据写入较慢，影响数据导入性能。
- 不使用Auto Bucket，需按照已有的数据量来进行分区分桶，能更好地提升导入及查询性能。Auto Bucket会造成Tablet数量过多，最终导致有大量的小文件。
- 创建表时的副本数必须至少为2，默认是3，禁止使用单副本。
- 没有聚合函数列的表不应该被创建为AGGREGATE表。
- 创建主键表时需保持主键的列唯一，不建议将所有列都设置为主键列，且主键表需设置value列。主键表不建议用于数据去重场景。
- 创建Doris表动态分区时，禁止使用auto partition特性，推荐使用dynamic partition。
 
#### Doris建表建议
- 单表物化视图不能超过6个，物化视图不建议嵌套，不建议数据写入时通过物化视图进行重型聚合和Join计算等ETL任务。
- 对于有大量历史分区数据，但是历史数据比较少，或者数据不均衡，或者数据查询概率较小的情况，可以创建历史分区（比如年分区，月分区），将所有历史数据放到对应分区里。 创建历史分区方式为**：FROM ("** *2000-01-01* **") TO ("** *2022-01-01* **") INTERVAL 1 YEAR**
  
- 1千万\~2亿以内数据为了方便可以不设置分区（Doris内部有一个默认分区），直接用分桶策略即可。
- 如果分桶字段存在30%以上的数据倾斜，则禁止使用Hash分桶策略，改为使用Random分桶策略，相关命令为： **Create table** ... **DISTRIBUTED BY RANDOM BUCKETS** *10* ...
  
- 建表时第一个字段一定是最常查询使用的列，默认有前缀索引快速查询能力，选取最常查询且高基数的列作为前缀索引，默认将一行数据的前36个字节作为这行数据的前缀索引（varchar类型的列只能匹配20个字节，并且会匹配不足36个字节截断前缀索引） 。
- 超过亿级别的数据，如果有模糊匹配或者等值/in条件，可以使用倒排索引（Doris 2.x版本开始支持）或者Bloomfilter。如果是低基数列的正交查询适合使用bitmap索引（bitmap索引的基数在10000\~100000之间效果较好）。
- 建表时需要提前规划将来要使用的字段个数，可以多预留几十个字段，类型包括整型、字符型等。避免将来字段不够使用，需要较高代价临时去添加字段。
- Doris表属性中compaction的time_series和single replica策略在数据写入频繁和非日志类数据场景下存在IO增高和compaction不彻底现象，不建议开启使用。
 
