Mysql 大量增删改?
有一张给客户发消息名单表,每天有 150 万数据插入、然后查询、然后推 kafka 并更新,然后消费 kafka 再更新。这 150 万数据是陆陆续续的写入查询更新的,写查更新操作不能岔开。现在有性能瓶颈:cpu、io 飙得很高,有什么优化方案吗?不考虑分库,可以考虑分表
回答·9
最热
最新
- 拆表,查询的和写的分开两种。 负载均衡,数据分发到多个数据库节点分摊压力,注意分布式数据一致性的问题。 批量提交,不要频繁的操作 io,例如数据库,文件系统。
- 具体问题,得具体分析。 我只简单说几点,如果有效果,可以私信详谈进行深度优化。 1、如果 ID 是自增的。可以将当前已入队最大 ID 记录到单独的一张表中。每次根据 ID 查询一定数量的数据,写入 Kafka,不必更新原表状态,只更新该标表中的最大 ID 即可。这样减少原表的写入操作。 2、定期对数据表进行 optimize table 操作。不要问我为什么,保证让你爽! 3、硬件提升,尽量使用 ssd。
- 按道理 150 万每天的插入 MySQL 压力不能算大,可以尝试缓存一批后 batch insert。另外,也应该先明确一下具体什么原因导致高 load 和高 io。是不是查询没走索引,还是索引太多导致插入性能问题,否则都只是考经验瞎撞。
- 需要具体情况具体分析,先检查压力来自插入还是查询。来自插入要进一步分析是什么引起的,数据存量大就考虑分表,数据写入频繁考虑批量插入。 压力来自查询,先考虑优化查询 sql、数据库表和数据库配置,最后考虑读写分离方案。 没有详细信息不好说。
- django 插过 600 万条数据 3 秒插入完成
- 如果 mysql 压力很大,那么可以将数据先写到 mq,然后消费到 mysql,来达到消费的目的,进而降低 mysql 的压力。 mysql 端如果是写多读少,建议开启 change buffer,并设置较大值。来增加写操作的速度,降低页的随机读。 还有你的 redo log 也要足够大,redo log 满了,来进行刷脏页。
- 可以用缓存 redis,吧数据查询更新和修改方法解耦合,不要都让数据库承担压力,数据修改和查询的细节上可以考虑下链表和数组的的区别,用不同的集合实现
- 直接推 kafka 不好?
- 平均一秒钟 17,其实 150 万也不是很多。可以考虑用 redis 中转一下。不过要注意数据一致性的问题,数据延时问题,缓存崩溃,以及持久化等问题。