处理具有数百万条记录更新和大量读数的 MySQL 表的最佳方法

Posted

技术标签:

【中文标题】处理具有数百万条记录更新和大量读数的 MySQL 表的最佳方法【英文标题】:Best way to handle a MySQL table with millions of records updating and large readings 【发布时间】:2015-09-18 21:44:14 【问题描述】:

我有一个包含大约 500 万条记录的表,每次更新都会更新很多(每分钟大约 10.000 条)。

另一方面,我必须经常阅读该表。幸运的是,我不需要“现在”的数据,我可以“缓存”它(可能的解决方案基于下面这个),但不超过 20 秒。

这可能会导致表锁定,我担心......有什么解决方案吗?

我考虑过只为更新问题而离开该表,并制作一个 VIEW 将所有数据复制到一个专用于读取的表中,但它是一个大表,并且需要太多时间。

还有其他想法吗?

【问题讨论】:

在同一分钟内您需要读取/缓存多少条 5e6 记录?因为无论如何,5m 中的 10k 只占桌子的 0.2%。 如果您使用 InnoDB 表,您应该没有任何问题; the reference manual 表示 InnoDB 支持行级锁定 最好的方法在很大程度上取决于更新的性质(它们是每分钟一次批量更新吗?个别更新随机出现?其他?)和查询负载的性质(一行,所有行,最近更新的行?)。但是,对于简单的配置,每秒 200 次更新是相当合理的。如果您必须处理 100 倍的峰值负载,那么您肯定需要考虑扩展问题。 【参考方案1】:

有很多事情你没有告诉我们。表的结构、更新的性质、数据库引擎、底层硬件、成本和时间的限制、解决方案所需的弹性、您为尝试确定核心问题所做的说明。这不是分享这个的邀请——我们can't advise on capacity planning,甚至描述basic steps for performance tuning 都超出了这里的帖子范围。

我希望人们会投票结束这个,但我会给你一些建议:

    建立测试流量和衡量性能的能力,这样您就不会在调整工作中浪费时间。

    表锁定应该只是 myisam 上的问题,而不是其他引擎。

    使用处理程序 api 连接到数据库,最好是通过基于事件的守护程序,该守护程序可以将更新聚合到更少的逻辑操作中。

    注意配置存储的方式。

    设置到从节点的异步复制并对其进行读取。

【讨论】:

以上是关于处理具有数百万条记录更新和大量读数的 MySQL 表的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

具有数百万条记录的 2 个数据帧之间的 Pyspark 交叉连接

MYSQL 对 4000 万条记录表和 128GB 内存的专用服务器进行大量更新需要很长时间

数百万条记录的增量更新,索引与连接

在具有数百万条记录的 2 个表上加入更快

Rownum 或 Fetch/offset 适合选择和处理数百万条记录

如何在 SQL Server 中更新具有数百万行的大表?