大批量数据,增删改查,要注意什么?

大批量数据,增删改查,要注意什么? 大批量数据做增删改查要注意什么如果数量级达到千万级别有大数据相关的组件可以优先使用。如 ClickHouse、Elasticsearch 、Flink等这些组件。假设没有大数据相关的组件那么有很多的要点需要注意。大批量数据的查询查询的sql语句最好得走索引游标查询避免深度分页每批大数量的分页比如 LIMIT 1000000, 10 会导致 MySQL 扫描并丢弃前一百万条数据极度消耗 CPU 和 IO。改用“上一页最大 ID”的游标查询WHERE id #{lastId} LIMIT 10大批量数据的数据统计不能在用户发起接口请求时进行实时统计。 利用大数据或调度框架如 XXL-JOB等在夜间或业务低峰期把大批量数据的统计结果提前计算好存入统计表中最后在请求时查询统计表的数据。大批量数据的新增批量写入/更新Value(${my.batch.size:500}) private Integer batchSize; for (int startIndex 0; startIndex userIdList.size(); startIndex batchSize) { int endIndex Math.min(startIndex batchSize, userIdList.size()); //分批更新 myDao.saveList( userIdList.subList(startIndex, endIndex) ); }削峰入库如果在业务高峰期有突发的海量写入不要直接打库。先写入 MQ再由后台消费者异步入库。大批量数据的修改避免长事务 更新涉及大量数据时不要在一个大事务里完成否则Undo Log 暴增且长时间占用连接池和锁资源。并发更新使用乐观锁使用版本号字段Version、状态机 控制。使用乐观锁并发修改同一行不要用悲观锁也就是 SELECT … FOR UPDATE。大批量数据的删除物理删除DELETE会破坏索引连续性产生大量碎片空间甚至引起 B 树结构重平衡。使用 is_deleted 字段将 DELETE 转化为 UPDATE逻辑删除。删字段时不要直接 drop column不然会锁表。尤其是千万级别的大表不能直接删字段可以Rename字段视为废弃字段。如果真的必须得删除可以先新建一张新的表将数据导入新的表全量迁移并将新的表修改表名观察几天平稳运行后最后再删除旧表。