我正在构建一个web应用程序,它由执行以下操作的用户组成:
在包含数百万条目的solr服务器上浏览和搜索。(应用程序的这一部分工作得非常好。)
选择此数据的特权部分(某些特定搜索的结果),并将其临时保存为“数据集”。(我希望数据集大小限制在真正大的范围内,比如说50万个结果)。
对该数据集执行一些杂项操作。
(前端是内置的rails,但我怀疑这是否真的与如何解决这个特殊问题有关。)
第二步,以及如何检索第三步的数据,都给我带来了麻烦。我需要能够临时保存数据集,在需要时恢复它们,并在一段时间后使它们过期。问题是,我的结果有sha1个校验和id,所以每个id有48个字符。一个500000条记录的数据集,即使我只存储id,也是22mb的数据。因此,我不能只拥有一个数据库表,并为用户构造的每个数据集抛出一行。
以前有人需要这样的东西吗?解决这个问题的最好方法是什么?我应该为用户构造的每个数据集生成一个单独的表吗?如果是的话,那么在一段时间后终止/删除这些表的最佳方法是什么?如果需要的话,我可以部署一个mysql服务器(虽然我还没有一个,所有的数据都在solr中),如果有其他东西可以满足我的需求,我也会打开一些更疯狂的软件。
编辑:一些更详细的信息,在下面回应杰夫·费尔兰。
数据对象是不可变的、静态的,并且完全位于solr数据库中。它作为文件可能更有效,但我更希望(出于搜索和浏览的原因)将它们保留在原来的位置。数据和数据集都不需要分布在多个系统中,我不希望我们会得到这样的负载。现在,整个该死的东西运行在一个虚拟机内(如果我到了那里,我可以穿过那座桥)。
所谓“需要时恢复”,我的意思是这样的:用户运行一个精心编制的搜索查询,从而为他们提供一些对象集。然后他们决定要操纵那一套。当他们(作为一个随机示例)单击“Graph these objects by year”按钮时,我需要能够检索完整的对象ID集,这样我就可以将他们带回solr服务器并运行更多的查询。我宁愿存储对象i d(而不是搜索查询),因为当我们添加更多对象时,结果集可能会在用户下面更改。
“while”大致是用户会话的长度。不过,有一个复杂的问题可能很重要:我可能最终需要实现一个作业队列,这样我就可以推迟处理,在这种情况下,“while”需要“只要处理您的作业所需的时间”。
感谢杰夫鼓励我提供更详细的信息。

最佳答案

第一个技巧:不要将sha1表示为文本,而是表示为它占用的20个字节。您看到的十六进制值是以人类可读形式显示字节的一种方式。如果你储存得当,你的容量是9.5兆而不是22兆。
第二,你还没有真正解释你所做事情的本质。您保存的数据集是否引用现有数据库中的不可变对象?你说在需要的时候恢复它们是什么意思?当你谈到过期的时候,“一段时间”是多久?您引用的基础数据是静态的还是动态的?您可以保存搜索模式和偏移量,还是需要保存单个引用?
与会话相关的数据是否需要插入数据库?在文件中是否更有效?是否需要跨多个系统分发?
我的答案里还有很多问题。为此,您需要更好地表达甚至定义您提供的技术概述之外的需求。
更新:有很多可能的解决方案。这里有两个:
将它们写入具有递增搜索ID的单个表(保存的搜索或类似的表)。按排序顺序插入密钥的额外积分。(search_id unsigned bigint,item_id char(20),主键(search_id,item_id)。这将真正限制碎片,保持每个搜索集群,并释放大致按顺序排列的页面。这几乎是一个滚动表,这是进行大量插入和删除的最佳情况。在这种情况下,您需要为插入支付一笔费用,而删除则需要双倍的费用。您还必须迭代整个搜索结果。
如果您的搜索项具有递增的主ID,因此任何新插入到数据库的值都将高于数据库中已有的值,这是最有效的。或者,插入日期戳将以更低的效率实现相同的效果(实际上必须在查询中检查每一行,而不仅仅是索引项)。如果您注意到最大ID,并且不删除记录,则可以通过在保存的查询上始终设置最大ID来保存使用零空间的搜索。

关于mysql - 是否存储大型的 session 级数据集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7296466/

10-11 05:02
查看更多