
# 对于千万或亿级的超大表如何高效写入数据或创建索引
#### 大表高效写入数据的方法
对于千万或亿级大数据量的表，建议使用如下方法提升数据写入效率。
- 删除不必要的索引。 更新数据时候，同时会更新索引数据。对于大数据量的表，避免创建大量的索引，影响更新速度。请根据业务评估，删除不必要的索引。
  
- 插入多条数据时，尽量选择批量插入。 因为批量插入只需要远程请求一次数据库。
  示例如下：
  ```
  insert into tb1 values(1,'value1');
  insert into tb2 values(2,'value2');
  insert into tb3 values(3,'value3');
  ```
  优化为：
  ```
  insert into tb values(1,'value1'),(2,'value2'),(3,'value3');
  ```
  
- 插入多条数据时，尽量选择手动控制事务插入 通过手动控制事务，可以将多条执行单元合并为一个事务，避免多个事务的开销，同时保证数据的完整性和一致性。
  示例如下：
  ```
  insert into table1 values(1,'value1'),(2,'value2'),(3,'value3');
  insert into table2 values(4,'value1'),(5,'value2'),(6,'value3');
  insert into table3 values(7,'value1'),(8,'value2'),(9,'value3');
  ```
  优化为：
  ```
  start transaction;
  insert into table1 values(1,'value1'),(2,'value2'),(3,'value3');
  insert into table2 values(4,'value1'),(5,'value2'),(6,'value3');
  insert into table3 values(7,'value1'),(8,'value2'),(9,'value3');
  commit;
  ```
  ![](https://support.huaweicloud.com/taurusdb_faq/public_sys-resources/caution_3.0-zh-cn.png)
  合并的语句不能过多，过多时可能会出现大事务，导致表被长时间锁定。请根据业务评估，合理控制事务中的语句个数。
  
- 使用主键，在插入数据时，尽量选择主键顺序插入，选择使用AUTO_INCREMENT自增主键。 因为当主键乱序插入时，会产生"页分裂"，消耗性能。
  示例如下：
  主键乱序插入 : 6 2 9 7 2
  主键顺序插入 : 1 2 4 6 8
  
- 尽量不要使用UUID做主键或者是其他自然主键，如身份证号。 每次生成的UUID之间无序，插入时为主键乱序插入，会产生"页分裂"，消耗性能。
  
- 业务操作时，避免对主键的修改。 修改主键后还需对索引结构进行修改，花费代价较大。
  
- 满足业务需求的情况下，尽量降低主键的长度。
- 不要使用外键来维护外键关系，通过程序来控制。
- 读写业务分离。读业务放到备库上，避免因IO导致插入慢。
 
#### 大表高效创建索引的方法
对于千万或亿级大数据量的表，建议使用如下方法提升创建索引的效率。
- 索引字段尽量小。
- 选择区分度高的列作为索引列。
- 如果表中每个字段都无法保证唯一、无法保证NOT NULL，或者不适合做索引，推荐自定义一个ID自增列作为主键，自动满足有序插入。
- 需要创建索引时，建议先把数据插入完，再使用alter table add index的方式添加索引。
- 使用TaurusDB的并行创建索引功能。当数据库硬件资源空闲时，您可以通过并行创建索引功能加速DDL执行，避免阻塞后续相关的DML操作，缩短执行DDL操作的窗口期。
 
