
# 确定表索引
#### 表索引介绍
| 索引类型          | 索引特点                                                                                                                                                                                                                                                                                                                                                        | 支持引擎        | 优选场景                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|:---|
| SIMPLE        | - 分区级更新，同主键数据写到不同分区时不会触发更新，会出现数据重复。  - 比较吃内存，采用join方式完成更新。                                                                                                                             | Spark       | - cow表，批场景。                                                                                                                                                                                                                                                                                                                                                                    |
| BUCKET        | - 每一行数据都按照设置的桶数去哈希到对应的bucket桶，写入速度最快。  - 无数据量级限制，大数据场景表现突出，分桶可以打散数据，有效控制文件数量。  - 多引擎兼容，Flink和Spark同时操作同一个hudi表时必须使用该索引。   | Spark/Flink | - mor表，流场景，实时写入。  - mor表，批场景。  - cow表，无更新的append场景，实时写入。适合于对写入性能有要求和点查场景，但是append会产生非常多的小文件，需要搭配分区过滤和bucket桶过滤来使用。**对MRS版本有要求，使用前先咨询。**  - cow表，每次都是insert overwrite写入。   |
| BLOOM         | - 分区级更新，同主键数据写到不同分区时不会触发更新，会出现数据重复。  - BLOOM索引**在大数据量场景的性能表现** **与更新的数据量有关，更新占比越大，性能越差**；大数据量场景产生的文件数量较多，不推荐使用。                                                                           | Spark       | - cow表，批场景，更新占比20%以内。  - mor表，批场景，更新占比20%以内。                                                                                                                                                                                                                                                                |
| GLOBAL_BLOOM  | - 表级更新，同主键数据写到不同分区也会更新。  - **大数据量场景性能很差，一般不推荐使用**。                                                                                                                                   | Spark       | - 数据量百万以内，全局去重场景。                                                                                                                                                                                                                                                                                                                                                        |
| GLOBAL_SIMPLE | - 表级更新，同主键数据写到不同分区也会更新。  - **大数据量场景性能很差，一般不推荐使用**。                                                                                                                                      | Spark       | - 数据量百万以内，全局去重场景。                                                                                                                                                                                                                                                                                                                                                          |
   
#### 经典场景：
- COW表一直使用insert overwrite方式写入，可以选择BUCKET索引。
- COW使用insert into方式写入，要慎用BUCKET索引，因为BUCKET索引可能导致增量数据要去更新所有的BUCKET桶，后面会越写越慢。数据量在万级或百万级，COW选择SIMPLE和BUCKET都可以，差别不是很大。数据量在千万级以上，建议SIMPLE。
- MOR表使用insert into方式写入，推荐BUCKET索引，它可以适用于多引擎混写混读，也可以适用于大数据量场景，是一个非常通用的方案，缺点就是需要定期做compaction。
- MOR表没必要一直使用insert overwrite写入，直接用COW表 + insert overwrite + BUCKET索引。
 
#### 确认BUCKET索引桶数（BUCKET索引表必须参考此内容预估桶数）
**Hudi表的bucket桶数需要在建表时确定，后期不能变更，桶数设置不合理将会导致严重的性能问题，必须按照以下步骤去预估bucket桶数：**
- 非分区表
  1. 预估Hudi表总数据条数A，不能是现有的存量数据条数，要考虑该Hudi表未来5年的增幅，比如5年内该Hudi表总数据量增长到A。
  
  2. 确认Hudi表单条数据大小B(kb)，使用limit 100随机查询源表的100条业务数据，将这100条业务数据放到txt文件里，B = txt文件大小kb / 100。
  
  3. 确认Hudi表未压缩前数据量C(G)， C = A\*B/1024/1024。
  
  4. 预估Hudi表桶数D，D = MAX（取整(C/2\*1.5), 4）
  
  
  ![](https://support.huaweicloud.com/devg-rule-mrs/public_sys-resources/note_3.0-zh-cn.png)
  D = MAX（取整(C/2\*1.5), 4），此公式中数字2的含义是2G数据分一个bucket桶，数字1.5的含义是无分区表多预留1.5倍的bucket桶数。
  
- 分区表
  1. 预估Hudi表单个分区内的总数据条数A，注意不是整表数据量，而是单个分区未来5年内的总数据量增长到A。比如按天分区，那就要考虑未来几年后在一些特殊的节假日将会产生多少数据量；比如按年分区，那就要考虑未来几年后的业务数据增长量。
  
  2. 确认Hudi表单条数据大小B(kb)，使用limit 100随机查询源表的100条业务数据，将这100条业务数据放到txt文件里，B = txt文件大小kb / 100。
  
  3. 确认Hudi表未压缩前数据量C(G)， C = A\*B/1024/1024。
  
  4. 预估Hudi表桶数D，D = MAX（取整(C/2), 1）
  
  
  ![](https://support.huaweicloud.com/devg-rule-mrs/public_sys-resources/caution_3.0-zh-cn.png)
  1. 预估桶数要使用未压缩的数据量来预估，不能以源表中的压缩文件大小为准，比如parquet文件。
  
  2. 桶的设置以偶数最佳，非分区表最小桶数请设置4个，分区表最小桶数请设置1个。
    
 
