【发布时间】:2018-07-17 15:00:08
【问题描述】:
我正在熟悉 Couchbase(我开始使用 Server Community Edition),我的目标是迁移我们当前的 SQLite 数据库到 Couchbase,以便与移动设备建立高效的实时同步机制。
到目前为止,第一步是积极的,我们已经创建了存储桶(每个 SQLite 表一个存储桶)并导入了所有数据(每个 SQLite 行一个 JSON 文档) . 此外,为了允许复杂的查询和过滤,我们为所有存储桶创建了索引(主要和次要)。
总而言之,我们有两个主要的桶:
1) players,其中包含具有以下结构的文档
{
"name": "xxx",
"transferred": false,
"value": n,
"playmaker": false,
"role": "y",
"team": "zzz"
}
2) 标记,具有以下结构(其中“玩家”字段是对玩家存储桶中文档 ID 的引用)
{
"drawgoal": 0,
"goal": 0,
"owngoal": 0,
"enter": 1,
"mpenalty": 0,
"gotgoal": 0,
"ycard": 0,
"assist": 0,
"wingoal": 0,
"mark": 6,
"penalty": 0,
"player": "xxx",
"exit": 0,
"fmark": 6,
"team": "yyy",
"rcard": 0,
"source": "zzz",
"day": 1,
"spenalty": 0
}
到目前为止还不错,但是当我尝试运行需要 JOIN 的复杂 N1QL 查询时,与 SQLite 相比,性能相当糟糕。 例如,执行此查询大约需要 3 秒:
select mark.*, player.`role` from players player join marks mark on key mark.player for player where mark.type = "xxx" and mark.day = n order by mark.team asc, player.`role` desc;
我们目前在播放器中有 600 个文档(使用的磁盘 = 16MB,使用的 RAM = 12MB)和标记中的 20K 文档(使用的磁盘 = 70MB,使用的 RAM = 17MB),应该不多从我的角度来看。
是否可以调整任何设置来提高 JOIN 性能? 我可以创建任何特定索引吗?
与 SQLite 相比,这种性能下降是为了获得更多灵活性和更多功能而付出的代价吗?
我应该尽可能避免在 Couchbase 中使用 JOIN,而是在需要的地方复制数据?
谢谢
【问题讨论】:
标签: json sqlite join couchbase n1ql