
# 索引设计规范
- 【规格】使用数据库索引实践推荐的索引类型。
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  索引设计建议使用推荐类型。
  表1**数据库索引实践推荐** 
  | **索引类型** | **说明**                      | **是否推荐**  |
  |:---|:---|:---|
  | 主键/唯一索引  | 单列或多列主键/唯一索引                | 推荐        |
  | 全局索引     | 索引组织方式                      | 规划中       |
  | 表达式索引    | 索引列为表的一列或多列计算而来的一个函数或者标量表达式 | 限制使用      |
  | BTREE索引  | 索引构建类型                      | 部分数据类型上推荐 |
     
  
- 【规则】组合索引字段个数不超过5个。
- 【规则】禁止总字符串长度超过200 的组合索引。
- 【规则】索引（包括单列索引和复合索引）字段应为NOT NULL字段。
- 【建议】不建议单表创建多个唯一索引。 同时维护多个唯一索引的开销远大于维护一个多列唯一索引，如果业务逻辑上多个唯一索引，与一个多列唯一索引等价，应使用多列唯一索引。
  
- 【建议】同字段上创建索引的维护效率不同。数值类型字段优于字符类型及其他数据类型，因此对于考虑创建索引的ID、时间等字段，建议使用数值类型进行存储。
- 【建议】应考虑在关联列上创建索引。 支持HASH JOIN，但是在内表较小等RESCAN代价较低的情况下，仍然可以选择NESTLOOP JOIN来完成关联。如果通过EXPLAIN可以查看到NESTLOOP JOIN计划，则可以通过在关联列上创建索引，提高NESTLOOP JOIN效率。
  
- 【建议】在创建组合索引时，需根据查询条件和组合索引最左匹配原则创建。
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 组合索引最左匹配原则：如果查询条件包含了组合索引的一列或者多列，那么组合索引的最左边开始的连续列需要与查询条件匹配上。
  
  
  
  - 当查询为where a = ?, b = ?,c = ?, d = ? 或者 where a = ?, b = ?,c = ? 等时，都是最佳的索引匹配；当查询为where b = ?,c = ?, d = ? 或者 where c = ?, d = ? 等时，在代价计算后可能也会走索引idx_test_abcd，但是这种情况走索引时会扫描索引的全部页面，导致SQL性能并不理想。类似情况建议根据最左匹配原则创建适合此查询条件的组合索引。
    ```
    --创建表test。
    gaussdb=# CREATE TABLE test(a int, b int, c int, d int, e int, f text);
    创建组合索引。
    gaussdb=# CREATE INDEX idx_test_abcd ON test(a,b,c,d);
    ```
    
    
 
