我应该做些什么来适应大规模的数据存储和检索?

2024-06-01 03:47:45 发布

您现在位置:Python中文网/ 问答频道 /正文

mysql数据库的表中有两列。第一列包含指纹,而第二列包含具有该指纹的文档列表。这很像是由搜索引擎建立的反向索引。表中记录的实例如下所示

34 "doc1, doc2, doc45"

指纹的数量非常大(可以达到数万亿)。数据库中基本上有以下操作:插入/更新记录和根据指纹中的匹配检索记录。表定义python片段是:

^{pr2}$

insert/update操作的代码段是:

if self.cursor.execute("UPDATE `fingerprint` SET documents=CONCAT(documents,%s) WHERE fp=%s",(","+newDocId, thisFP))== 0L:
                self.cursor.execute("INSERT INTO `fingerprint` VALUES (%s, %s)", (thisFP,newDocId))         

到目前为止,我观察到的唯一瓶颈是mysql中的查询时间。我的整个应用程序都是基于web的。所以时间是一个关键因素。我也曾想过使用卡桑德拉,但了解较少。请给我提个更好的办法来解决这个问题。在


Tags: 文档self数据库列表execute记录时间mysql
3条回答

Greenplum data warehouse,FOC,postgres驱动,祝你好运。。。在

这种数据结构不太适合SQL—SQL中的“正确”设计是为每个指纹/文档对设置一行,但查询速度将非常慢,除非您添加一个会占用太多空间的索引。对于您所要做的,SQL增加了很多开销来支持您不需要的函数,而不支持您确实需要的多值列。在

redis集群可能是一个很好的选择——原子集操作应该非常适合您所做的事情,并且通过正确的虚拟内存设置和一致的哈希将指纹分布在节点上,它应该能够处理数据量。然后命令将是

SADD fingerprint, docid

添加或更新记录,以及

^{pr2}$

获取所有带有指纹的文件ID。在

SADD是O(1)。SMEMBERS是O(n),但n是集合中的文档数,而不是系统中的文档/指纹数,因此在本例中也有效地为O(1)。在

您当前使用的SQL insert是O(n),n是非常大的记录总数,因为这些记录存储为有序列表,在insert时必须重新排序,而不是散列表(get和set的时间都是常量)。在

获取一个高端数据库。甲骨文有一些优惠。还有SQL Server。在

数万亿个条目远远超出了普通数据库的范围。这是非常高端的非常特别的东西,尤其是如果你想要体面的表现。另外,还需要硬件—这意味着有一个像样的中端服务器、128+gb的缓存内存,以及一个像样的SAN或通过SAS提供足够好的DAS设置。在

记住,万亿意味着:

  • 每个字节使用1000gb。在

如果指纹存储为int64,则仅此数据就有8000gb的磁盘空间。在

或者你试着从一个小型的廉价服务器上运行它,我有两张2tb的光盘?祝你好运。在

相关问题 更多 >