对于千万或亿级的超大表如何高效写入数据或创建索引
大表高效写入数据的方法
- 删除不必要的索引。
更新数据时候,同时会更新索引数据。对于大数据量的表,避免创建大量的索引,影响更新速度。请根据业务评估,删除不必要的索引。
- 插入多条数据时,尽量选择批量插入。
示例如下:
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做主键或者是其他自然主键,如身份证号。
- 业务操作时,避免对主键的修改。
- 满足业务需求的情况下,尽量降低主键的长度。
- 不要使用外键来维护外键关系,通过程序来控制。
- 读写业务分离。读业务放到备库上,避免因IO导致插入慢。
大表高效创建索引的方法
对于千万或亿级大数据量的表,建议使用如下方法提升创建索引的效率。
- 索引字段尽量小。
- 选择区分度高的列作为索引列。
- 如果表中每个字段都无法保证唯一、无法保证NOT NULL,或者不适合做索引,推荐自定义一个ID自增列作为主键,自动满足有序插入。
- 需要创建索引时,建议先把数据插入完,再使用alter table add index的方式添加索引。
- 使用GaussDB(for MySQL)的并行DDL功能来创建索引。当数据库硬件资源空闲时,您可以通过并行DDL功能加速DDL执行,避免阻塞后续相关的DML操作,缩短执行DDL操作的窗口期。