文档首页/ 云数据库 GaussDB(for MySQL)/ 常见问题/ 数据库基本使用/ 对于千万或亿级的超大表如何高效写入数据或创建索引
更新时间:2024-09-11 GMT+08:00
分享

对于千万或亿级的超大表如何高效写入数据或创建索引

大表高效写入数据的方法

对于千万或亿级大数据量的表,建议使用如下方法提升数据写入效率。
  • 删除不必要的索引。

    更新数据时候,同时会更新索引数据。对于大数据量的表,避免创建大量的索引,影响更新速度。请根据业务评估,删除不必要的索引。

  • 插入多条数据时,尽量选择批量插入。

    因为批量插入只需要远程请求一次数据库。

    示例如下:

    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;

    合并的语句不能过多,过多时可能会出现大事务,导致表被长时间锁定。请根据业务评估,合理控制事务中的语句个数。

  • 使用主键,在插入数据时,尽量选择主键顺序插入,选择使用AUTO_INCREMENT自增主键。

    因为当主键乱序插入时,会产生“页分裂”,消耗性能。

    示例如下:

    主键乱序插入 : 6 2 9 7 2

    主键顺序插入 : 1 2 4 6 8

  • 尽量不要使用UUID做主键或者是其他自然主键,如身份证号。

    每次生成的UUID之间无序,插入时为主键乱序插入,会产生“页分裂”,消耗性能。

  • 业务操作时,避免对主键的修改。

    修改主键后还需对索引结构进行修改,花费代价较大。

  • 满足业务需求的情况下,尽量降低主键的长度。
  • 不要使用外键来维护外键关系,通过程序来控制。
  • 读写业务分离。读业务放到备库上,避免因IO导致插入慢。

大表高效创建索引的方法

对于千万或亿级大数据量的表,建议使用如下方法提升创建索引的效率。

  • 索引字段尽量小。
  • 选择区分度高的列作为索引列。
  • 如果表中每个字段都无法保证唯一、无法保证NOT NULL,或者不适合做索引,推荐自定义一个ID自增列作为主键,自动满足有序插入。
  • 需要创建索引时,建议先把数据插入完,再使用alter table add index的方式添加索引。
  • 使用GaussDB(for MySQL)的并行DDL功能来创建索引。当数据库硬件资源空闲时,您可以通过并行DDL功能加速DDL执行,避免阻塞后续相关的DML操作,缩短执行DDL操作的窗口期。

相关文档