方法一:
采用批量插入插入数据而不是一条条的插入数据。
TPS:每秒处理的事务数量
单挑插入:1000-5000
批量插入:5000-20000
为什么批量插入快?
因为单条插入相比批量插入他的事务开销更高,相当于要频繁的创建事务,网络I/O开销也很大,每插入一条都要通信一次,索引更新效率很慢,每次都要去找到索引的位置然后更新,而不是像批量插入那样,一次性更新一堆记录在索引树中。
不同数据量测试5次,结果如下:
单独插入50000条数据平均耗时:233748ms
批量插入50000条数据平均耗时:2590ms
对比:效率差50倍
单独插入10000条数据平均耗时:22036ms
批量插入10000条数据平均耗时:3330ms
对比:效率差6倍
单独插入1000条数据平均耗时:3122ms
批量插入1000条数据平均耗时:374ms
对比:效率差8倍
数据量越大效果越明细
测试数据来源于网络
方法二:
使用消息队列(如 Kafka、RabbitMQ)或本地缓存队列(如 Redis、Disruptor)暂存短链数据。
异步的写入mysql避免一直卡在数据库插入这个操作中。
方法三:
分库分表,对短链url进行hash计算,计算得出的短链作为分片健,然后这样基本上可以均匀的分配到t_link_(0~15)表里边。
这样也能让单表压力减小16倍。同时使用java多线程编程,实现同一时间向不同表插入数据。