在我自己的服务器和AWS服务器上进行了多天的研究和多次负载测试之后,我决定向社区提问。
我正在开发一个图像跟踪平台。在此平台上,用户可以关注图像和其他图像,这些图像是作为对后续图像的回复而发送的。
"追踪"该表在未来12个月内可达到1,000,000,000条记录。我们担心,每个用户访问我们的家必须咨询后面的所有照片,并通过他们加入以收集照片显示。 在跟踪表中,不进行DELETE和UPDATE,只进行INSERTS。
我已经进行了测试,使用Spawner Data Generator生成虚拟数据,在"跟踪"表。在完成三个必需的JOIN时,我得到了一个非常好的respio时间(或者我认为)~35ms,但是当我执行100个或更多并发查询时,系统运行速度非常慢,甚至需要25秒才能回答。
我认为MongoDB至少可以帮助每个用户(文档)有一系列照片跟随(子文档),但其中一个问题是16mb的限制,另一个是带来的每个"回复" (带有字段photo_id的文档)。我还试图做一个除了跟踪之外的集合(带有user_id和photo_id的文档)以避免16mb的问题,但是仍然存在带来"回复"的问题。 (我不认为它是一个最佳解决方案,除了我理解对于Relational数据不使用NoSQL。你必须使用适当的工具)
1 - SQL是设计用于进行此类查询还是我对技术的使用不当?
2 - 在这种情况下不应使用MongoDB,因为它依赖于关系数据。我是对的吗?
3 - 你有什么建议吗?
老实说,我非常关心表现,特别是公寓达到行的数量
Why You Should Never Use MongoDB - Sarah Mei:感兴趣的文章引起了标题的巨大轰动。我已经阅读了有关该文章的几个意见,而且我越来越困惑
用于测试的服务器:
首先:
与MariaDB一起使用-AWS免费套餐。第二
-CPU:Celeron J1900
-RAM:4GB 1666mhz
-SSD:32 GB
-OS:Ubuntu服务器16.04
-Software:MariaDB
第三
-CPU:i7 7700
-RAM:16GB 2133mhz
-SSD:512
-OS:Windows 10
-Software:MariaDB
答案 0 :(得分:5)
SQL是否设计用于进行此类查询...?
查询喜欢什么?您还没有显示任何疑问。
当您需要针对数百万行优化查询时,您必须非常具体地了解哪些查询您正在优化。您可以使用索引或分区或其他技术,但每种优化都会针对特定查询进行优化,但会牺牲其他查询。
在这种情况下不应使用MongoDB,因为它依赖于关系数据。我是对的吗?
MongoDB 3.2支持$lookup
,它有点像外连接。但它不可能像SQL中的索引连接一样高效。
MongoDB的另一个策略是存储更复杂的文档,所有依赖数据都嵌套在嵌套结构中。这样你就不必进行连接,但它会优化某种数据检索。
你有什么建议吗?
我建议您正确调整服务器的大小以适应您将使用的数据量。
为他们提供足够的RAM,以便您可以将数据集保存在InnoDB缓冲池中。确保调整MySQL / MariaDB选项以利用系统RAM。
为他们提供更强大的CPU,可以执行更多并发线程(在您的情况下,顶级CPU仍然是一个4核CPU,HT只有8个线程)。毫不奇怪,你的适度CPU被100个并发线程所淹没。
还计划更多地使用缓存。针对大型数据集的查询将非常昂贵。最快的查询可能是您根本不必执行的查询,因为结果已经在缓存中。您需要在应用程序级别进行架构以减少SQL查询负载。