non-DB或MongoDB如何维护非相等查询的二级索引

non-DB或MongoDB如何维护非相等查询的二级索引,mongodb,transactions,indexing,acid,rethinkdb,Mongodb,Transactions,Indexing,Acid,Rethinkdb,这是更多“内部工作”未解决的问题: 不支持*A*CID的noSQL数据库(意味着它们不能在一个事务中更新/插入然后回滚多个对象的数据)如何更新辅助索引 我的理解是——为了保持二级索引的同步(从另一个角度讲,它将变得过时,无法读取)——这必须发生在同一个事务中 此外,如果索引可能驻留在与数据不同的主机上,则需要存在分布式锁和/或两阶段提交,这样更新才能原子地工作 但是,如果这些数据库不支持多对象事务(这意味着它们不跨多个主机对数据进行两阶段提交),它们将使用什么方法来确保位于与数据分离的B树结构中

这是更多“内部工作”未解决的问题:

不支持*A*CID的noSQL数据库(意味着它们不能在一个事务中更新/插入然后回滚多个对象的数据)如何更新辅助索引

我的理解是——为了保持二级索引的同步(从另一个角度讲,它将变得过时,无法读取)——这必须发生在同一个事务中

此外,如果索引可能驻留在与数据不同的主机上,则需要存在分布式锁和/或两阶段提交,这样更新才能原子地工作


但是,如果这些数据库不支持多对象事务(这意味着它们不跨多个主机对数据进行两阶段提交),它们将使用什么方法来确保位于与数据分离的B树结构中的二级索引不过时?

这是MongoDB的答案

我不太清楚你的逻辑是什么。更新辅助索引与回滚多语句事务(如多次更新)无关

MongoDB对每个文档都有transactions,这就是更新索引的关键所在。如果需要,可以使用日记账反转这些操作

这必须在同一事务中发生

是的,很像RDBMS。应用的索引越多,写入的速度就越慢,在我看来,你知道为什么

当写入发生时,MongoDB将使用应用于特定索引的字段更新应用于该集合的所有索引

此外,如果索引可能驻留在与数据不同的主机上

我不确定MongoDB是否允许这样做,我相信它有一个JIRA;但是,我目前找不到那个吉拉

然后,需要存在一个分布式锁和/或两阶段提交,这样更新才能以原子方式工作

很有可能。允许此功能将是…好吧,让我们只说创建一个毛球

即使在分片设置中,每个范围的索引也驻留在分片本身上,而不是在配置服务器上

但是如果这些数据库不支持多对象事务(这意味着它们不跨多个主机对数据进行两阶段提交)

这不是两阶段提交的含义。我认为您需要重新了解什么是两阶段提交:

我想如果你说的是一笔交易,涉及多个碎片,嗯,好吧

他们使用什么方法来保证与数据分离的B树结构中的二级索引不过时

此外,我不确定为什么多文档事务会影响索引是否过时,而不是跨文档分组。唯一的例外是一个唯一的索引,但它也适用于单个文档更新;请注意,它的独特性在分片设置中有点毛茸茸的,无法保证


在您创建的索引中,通常每个文档前缀键一个条目,除非它是文档上的多键索引,否则您可以创建多个索引,但是,无论哪种方式,索引更新都是针对单个对象进行的,而不是通过多文档事务进行的,我不确定您的逻辑是什么,这就是我给出的答案

DB始终将二级索引数据与其索引的数据存储在同一台机器上。这允许在同一事务中对其进行更新。“重新思考”承诺对单文档操作很苛刻,并认为文档的索引是文档本身的一部分。

这是一个很好的问题


REJECTDB始终将辅助索引存储在与表的主索引/数据相同的主机上。即使是在连接的情况下,REJECTDB也会将查询带到数据,因此次索引、主索引和数据始终位于同一节点上。因此,不需要像两阶段提交这样的分布式锁定协议

RejectionDB确实支持一组有限的事务功能——单文档事务。对单个文档的更改以原子方式记录。相关的二级指数变化也作为交易的一部分记录,因此要么记录整个变化,要么根本不记录任何变化

扩展有限的事务功能以支持单个分片中的多个文档是很容易的,但是跨分片进行扩展是很困难的(由于您提到的分布式锁定原因),因此我们决定不为多个文档实现事务


希望这有帮助。

两阶段提交是一种用于跨多台主机维护事务完整性的协议。是的,我说的是跨多个主机的“多文档上的事务”。因此,问题是:如果Mongo和Rejection今天不执行两阶段提交事务,他们如何在与数据不同的碎片上维护二级索引。我认为你的答案是——他们不会在与数据不同的切分上维护二级索引。因此,它们不需要分阶段进行commit@VP好的,那么你的意思是在一个分片集中,那么:是的,他们不会在另一个分片上保留索引,而且两阶段提交不要求在两台主机之间,这是两个不同的事务作为一个操作完全原子化的情况,Mongo理解为。我想得到一些反馈意见。重新思考有连接,这意味着索引可能位于不同于数据主机的主机的内存中。此外,2phase commit还需要单独的主机:“分布式事务是一个操作捆绑包,其中涉及两个或多个网络主机”@VP我在上面找不到该文本page@Sammaya:上面的2阶段提交链接包含文本“它是一种分布式算法,协调参与分布式原子事务的所有进程