arangodb:文档大小对性能的影响
arangodb: performance impact of document size
文档结构
-user
- firstName
- lastName
...
- session
- table1
- filters, searches, states etc
- table2
- filters, searches, states etc
...
问题:我应该将会话数据保存在用户文档中还是单独的文档中?
如果用户登录,我们查询整个文档:
query = 'find the user... return u
如果用户注销,我们会保存用户,包括其会话状态
如果显示用户列表,我们只查询需要的文档字段:
query = 'for u in users.... return
{firstName: u.firstName, lastName: u.lastName}
思考:虽然我们只查询我们需要的数据,但是文档的大小会影响后台的DB性能吗?就像 Arangodb 在仅返回部分文档之前在后台获取整个文档一样吗?或者可能受更大文档大小影响的任何其他服务器进程?
ArangoDB 获取完整文档。为了获得最佳性能,您应该避免使用大型文档。您可以查看 here 如何从 RocksDB 键值存储接收文档的示例
会话数据需要与用户相关联,因此将其存储在用户顶点上可能更有意义,否则您可以存储在单独的顶点上并引用它(图中的边)。对于经常根据他们的请求提供服务的用户,缓存用户数据可能比现在查询数据库更有效。
如果用户处于活动状态,您可以将会话放在缓存等中间存储中以加快访问速度,您可以稍后在他注销时或在指定的时间间隔将其写入数据库一次。
如果文档的大小不断增加,您可以只考虑最近的 n
个会话(这取决于您的应用程序域和业务要求),因为用户偏好不断变化,以包含每个文档尺寸。
是的,在 arango 查询的情况下,在查询优化器应用索引和其他优化之前获取整个文档,这会对性能产生影响。
文档结构
-user
- firstName
- lastName
...
- session
- table1
- filters, searches, states etc
- table2
- filters, searches, states etc
...
问题:我应该将会话数据保存在用户文档中还是单独的文档中?
如果用户登录,我们查询整个文档:
query = 'find the user... return u
如果用户注销,我们会保存用户,包括其会话状态
如果显示用户列表,我们只查询需要的文档字段:
query = 'for u in users.... return
{firstName: u.firstName, lastName: u.lastName}
思考:虽然我们只查询我们需要的数据,但是文档的大小会影响后台的DB性能吗?就像 Arangodb 在仅返回部分文档之前在后台获取整个文档一样吗?或者可能受更大文档大小影响的任何其他服务器进程?
ArangoDB 获取完整文档。为了获得最佳性能,您应该避免使用大型文档。您可以查看 here 如何从 RocksDB 键值存储接收文档的示例
会话数据需要与用户相关联,因此将其存储在用户顶点上可能更有意义,否则您可以存储在单独的顶点上并引用它(图中的边)。对于经常根据他们的请求提供服务的用户,缓存用户数据可能比现在查询数据库更有效。
如果用户处于活动状态,您可以将会话放在缓存等中间存储中以加快访问速度,您可以稍后在他注销时或在指定的时间间隔将其写入数据库一次。
如果文档的大小不断增加,您可以只考虑最近的 n
个会话(这取决于您的应用程序域和业务要求),因为用户偏好不断变化,以包含每个文档尺寸。
是的,在 arango 查询的情况下,在查询优化器应用索引和其他优化之前获取整个文档,这会对性能产生影响。