我是一名自学成才的程序员,在构建可扩展的系统时,我总是遵循某些基于常识而非研究的设计参数。但是,我刚刚意识到我的系统的一个组件可能没有必要。
一般来说,我将用户数据分成组并将其分配给特定的mysql服务器。当负载均衡器后面的内容服务器收到请求时,我使用来自请求的数据(如用户ID)通过查询存储在DynamoDB上的中央表来解析存储用户数据的数据库,该中央表可以处理大量的负载。
但是,我还将用户数据分配给服务器内的数据库。就像我在每台服务器上都有100个数据库都具有相同的表结构,我将为每个数据库分配250个用户。
最初的逻辑是,每个用户拥有2k条目的表格运行速度更快,500k条目超过5000万条。然而,在我看来,以这种方式分解用户数据可能根本没有任何意义。 索引非常有效。我确定数据库实际上有某种内部逻辑,允许它以基本相同的速度访问数据吗?我已经这样做了十年了,我才意识到这可能根本就没有必要。有什么想法吗?我可以只使用其中的所有表格创建一个数据库,还是应该按照我一直以来的方式继续处理,在服务器上对100个数据库进行分片?
答案 0 :(得分:0)
这是一个理论上的,因此可能值得理解Big-O complexity又名时间复杂性的想法。
单个项目的聚簇B-Tree索引查找是O(log(n)),其中n是表中的行数。 DynamoDB是一种基于哈希的实现,它使其更接近O(1),这意味着它的性能不会随内容大小而发生明显变化。
现在对于数学,log(500k)= 5.7,其中log(50mil)= 7.7单行查找非常好,只要您避免命中磁盘以将索引加载到内存中。
所以,你说的是单行查找有25%的差异。这很重要,但仍然可能低于往返另一个数据库系统(如DynamoDB)的开销。
当然,您的里程可能会有所不同,因为存在将索引保留在内存等问题......所以您可能会发现生产环境存在差异。我强烈建议您设置测试,并验证您的表现。