如何以键值格式存储 300 万条记录?

Phi*_*hil 9 mysql database amazon-s3 csv

我们必须存储大约 300 万种产品的基本信息。目前,信息是一个 180 mb 的 CSV,每季度更新一次。

每天将有大约 30,000 次查询,但这些查询只是一个非常简单的键值存储。我们只需要查找产品 ID 并显示其余信息(这些信息都在一个记录中)。

这是针对 Web 的,因此快速的性能至关重要。

即使我们真的不需要关系数据库,我们是否应该使用 MySQL?我们应该每个季度生成 300 万个静态 html 文件吗?我们应该在 Amazon S3 或 Rackspace Cloud Files 之类的东西上为每个产品存储一行 CSV 吗?做这个的最好方式是什么?

Joh*_*ers 15

因为 MySQL 得到了如此广泛的支持,而且这确实是一件微不足道的事情,所以我建议使用它。除非服务器至少有几 GB 的内存,否则我建议坚持使用 MySQL 而不是使用内存系统。

一旦您开始将数据放入数据库,无论是 MySQL 还是其他数据库,您很可能会发现它有更多用途。现在您只是在谈论键值对,但与您的产品相关的其余数据必须存储在某个地方。如果那不是在数据库中,我无法想象数据存储非常高效。

无论您做什么,都不要创建那三百万个文件。我们已经在这里看到许多问题已经由如此多的文件创建的问题引起。


Laz*_*One 13

您可以使用专门针对此类任务优化的 NoSQL 数据库的 Key-Value 类型。看一下:

  • Redis -- Redis 是一个开源的高级键值存储。它通常被称为数据结构服务器,因为键可以包含字符串、散列、列表、集合和排序集合。
  • MemcacheDB -- MemcacheDB 是一个分布式键值存储系统,专为持久化而设计。
  • 其他(可以在此处找到此类列表之一:http : //nosql-database.org/

当然,你可以使用MySQL或任何其他关系数据库,但解决方案为数据的键值型设计应该是更好的(否则什么是排在首位设计它们的点,除了可能的事实,这将是更小(在 RAM 和 HDD 方面)解决方案)。


小智 6

现在是完全不同的东西:

鉴于:

  • 180MB/3M 产品 = 平均 62 字节/产品。
  • 每天 30,000 次查询 = 每秒 0.34 次查询
  • 每季度更新 = 基本静态数据

开箱即用的解决方案:

将每个产品转储为 TXT 资源记录并将其存储在 DNS 中,例如:

$origin products.example.com.

product_1_name IN TXT "product 1 description"
product_2_name IN TXT "product 2 description"
...
product_3000000_name IN TXT "product 3000000 description"
Run Code Online (Sandbox Code Playgroud)

好处:

  • 非常可靠和值得信赖(您已经每天都依赖它)
  • 几乎可以在任何平台上构建
  • 几乎每种语言都以一种或另一种形式支持 DNS 查询
  • 开源和商业服务器支持不同类型的后端数据库
  • 可以简单地复制(只需指定多个名称服务器)
  • 处理原子更新,即使在十几个服务器之间复制
  • 可以加密签名以确保数据完整性
  • 每秒能处理率更高数量级的查询命令(每10000个查询第二很容易与商品硬件处理)

这可能是一个坏主意的原因:

  • 您需要搜索数据(DNS 纯粹是键/值查找)
  • 您需要隐藏数据(DNS 没有机密性)


Mar*_*son 4

MySQL 与 MyISAM 和一些好的索引听起来非常适合这个。当然还有很多其他选项,但 MySQL 在任何商业网络主机上都得到了非常广泛(如果不是普遍)的支持。根据您所需的速度,memcached 可能也值得考虑,但如果不知道每个键/值对的大小,在内存中存储 300 万个键/值对可能比 180Mb CSV 文件更糟糕(哦等等,这是一个 180Mb 的 CSV 文件,所以我们知道它们有多大。它们一定是非常小的对,所以 memcached 可能会更好)。

想要 300 万个静态 HTML 文件,它会严重损害您的文件系统。一行 CSV,即使在 S3 上,也会遇到同样的问题。没有人希望一个文件夹中有 300 万个文件。