MySQL十亿记录

问题描述

我记录了大约600亿条记录。它的平均大小为980 GB,全部为文本文件。 (类似于md5代码的行) 是否可以将它们传输到数据库? 我想知道我是否遇到问题!

解决方法

当然可以。您将需要编写一个脚本以将文本文件中任何格式的数据加载到可以对数据库服务器执行的SQL中。

您可能会遇到的问题:

  1. 如果使用自动增量,请确保将其设为bigint。

  2. 加载时间很长。

为获得合理的性能,您的加载程序应使用带绑定参数的预准备语句,并以1000-10000的批处理次数进行提交。

在具有高时钟速度和NVMe存储的现代服务器上,您可能会看到每秒10,000次INSERT。以这种速度,加载数据集大约需要70天。

为减轻故障,您可能应该考虑创建已分区的表,并以使每个批处理都进入不同分区的方式将装载分为多个批处理。这样,如果批处理失败,则可以截断该分区并重新运行失败的批处理。

如果您不熟悉数据库并且无法使用这种规模的数据,则可能应该认真考虑聘请具有此类经验的专业人员来在大约3个月(或短短几周内,取决于他们存储的技巧包的存储量),将需要解析并加载所有数据。

,

MySQL可以存储600亿行的表。查看我对Maximum number of records in a MySQL database table

的回答

但是如果将980GB的CSV数据导入到MySQL表中后,它能容纳1TB的存储量,我会感到非常惊讶。我做了一个实验:我为MD5哈希创建了一个InnoDB表,并向其中加载了1,000,000行。

create table myhashes (hash char(32) primary key);

结果是一个表空间为68MB。您会认为,一百万个包含32个字符的字符串恰好是32 x 1,000。但是它使用的存储量是存储量的两倍以上。

InnoDB将表存储为主键值的B树。因此有很多开销。它还将数据存储在页面中,但不会将页面100%填满。每行还有一些元数据。简而言之,InnoDB比您的CSV数据占用更多的空间。

即使您的CSV数据以1对1的方式加载到了数据库中,您也会将存储量填满。如果过多填充,固态存储性能会降低。在我的工作中,如果任何卷的容量已超过90%,则会向工程师发出警报,然后我们需要采取措施将一些数据移至另一台服务器。不仅因为我们不希望该卷填充到100%,还因为性能下降。

如果您的存储空间更大,MySQL可以处理600亿行吗?是的,可以,但是可能不会很高兴。当我们看到一个表的记录数量是该记录数量的十分之一时,是时候考虑将其拆分,可能将其存储在多个服务器上了。我们有一些非常大的数据库,例如,一个应用程序将424 TB的数据集拆分到400台服务器上。对于数据集的实际限制,我们选择1TB作为简单的整数。 1TB并没有什么神奇之处,但是数据库越大,管理起来就越困难。因此,我们需要拆分大型数据集。

我想知道MySQL是否是最适合您的数据库产品。我不知道您将如何处理600亿个md5散列。您需要对此数据集执行哪些查询?尚不清楚您的CSV数据中是​​否还有更多的列,以将每个md5哈希与其他一些属性数据相关联。您需要为这些列编制索引以进行搜索吗?

根据需要执行的查询种类,使用可扩展的键/值存储(例如Cassandra或ScyllaDB或DynamoDB)可能会更高效。这些数据库会自动为您拆分数据,因此即使将数据存储在多个服务器上,您也可以像在一个数据库中一样查询它。

我必须评论一下,如果这是您的第一个数据库管理初学者项目,那么您可能会付出更多代价。您应该先了解如何管理规模适中的数据库,然后再扩展规模边界。

这就像您正在学习骑第一辆摩托车,而您想在第一次骑行中跳过100辆公共汽车。摩托车可以吗?也许吧,但是可能还没有准备好去做。