我有一个大约8TB大小的MySQL表.可以想象,查询是可怕的.

我在想:

  1. 使用分区创建新表
  2. 循环执行一系列查询以将数据转储到这些分区中

但循环将需要提交大量查询&每个都会很慢.

有没有更好的方法?现场重新划分生产数据库是行不通的——这似乎是一个不错的 Select ,但速度很慢

有没有一种工具可以让生活更轻松?而不是Python作业(job)循环&提交作业(job)?

提前多谢了

推荐答案

你可以用pt-online-schema-change.此免费工具允许您使用ALTER table语句对表进行分区,但它不会阻止客户端在重新构造表时使用该表.

另一个有用的工具可能是pt-archiver.您可以使用分区思想创建一个新表,然后让pt archiver将数据从旧表逐步复制或移动到新表.

当然,首先在一个小得多的表上的测试环境中try 使用这些工具,这样您就可以练习使用它们了.不要试图第一次在8TB表上使用它们.

无论使用何种解决方案,都需要足够的存储空间来存储整个数据集两次,再加上二进制日志(log).即使从中删除数据,旧表也不会收缩.所以我希望您的文件系统至少是24TB.或者,新表应该存储在不同的服务器上(或者理想情况下存储在多个其他服务器上).

无论使用哪种解决方案,都需要很长时间.我预计至少需要4周,如果您没有一台功能非常强大的服务器和直接连接的NVMe存储,可能需要更长的时间.

如果您使用远程存储(如Amazon EBS),它可能在您退休之前无法完成!

在我看来,即使try 分区,单个表的8TB也是一个问题.分区并不能神奇地修复性能,而且可能会使某些查询变得更糟.您有查询分区表的经验吗?您了解分区修剪是如何工作的,以及何时不起作用?

在 Select 分区作为解决方案之前,我建议您阅读MySQL手册:https://dev.mysql.com/doc/refman/8.0/en/partitioning.html中关于分区的整个章节,特别是关于限制:https://dev.mysql.com/doc/refman/8.0/en/partitioning-limitations.html的页面,然后用一个较小的表进行try .

与这种规模的数据分区相比,更好的策略是将数据分割成碎片,并将每个碎片存储在多个数据库服务器中的一个上.您需要一种添加更多碎片的策略,因为我认为数据将继续增长.

Mysql相关问答推荐

mysql使用LIKE查找二进制字段有问题

如何查询一行

发生的原因及解决方法

如何进行查询以在两个不同的列中搜索两个不同的数据字符串?

仅当 SELECT 语句在 MySQL 中给出空集时才执行 UPDATE 语句

如何编写按天数汇总值的sql查询?

仅计算 DATEDIFF (MySQL) 中的工作日

仅当其他行相等时才 Select 行值

MYSQL:范围匹配与周年纪念日

MySQL表中给定字段的每个不同值的连续记录形成对

SQL 查找边界之间的值

将每组的总和除以总数

MySQL查询根据同一表中其他字段的值更新表中的字段

在mysql中增量更新值

Doctrine2 迁移向下迁移并从浏览器而不是命令行迁移

用户 'User'@'%' 和 'User'@'localhost' 不一样吗?

第 1 行的 CSV 输入中的列数无效错误

MySQL获取两个值之间的随机值

在 Ubuntu 上安装 mysql gem 的困难

在 MySQL 中仅 Select 仅包含字母数字字符的行