COUCHDB 中的索引和排序
CouchDB中的索引功能与MongoDB不同
对于所有已更改的数据集,在更改后首先读取这些数据集时自动触发。
根据集合数据发出键/值对的 map 函数将导致查看结果。当第一次访问这样的视图时,从这些数据中构建一个 B 树索引。在随后的查询中,数据从 B 树返回,基础数据保持不变。这意味着超出第一个查询的查询将利用 B 树索引。
CouchDB 中的 B 树索引
B 树索引适用于大量数据。尽管有巨大的数据增长,B 树的高度仍然保持在单位数字,并允许快速的数据检索。在 CouchDB 中,B-tree 实现具有专门的特性,比如多版本并发控制和只追加设计。
多版本并发控制(mvCC)意味着多个读写操作可以并行进行,而不需要独占锁定。最简单的类似方法是像 GitHub 这样的分布式软件版本控制。所有写操作都是有序的,读操作不受写操作的影响。
CouchDB 具有一个_rev属性,该属性保存最新的修订值。与乐观锁定一样,写入和读取也是基于 _rev 值进行协调的。
因此,每个版本都是客户机开始读取数据时的最新版本。当修改或删除文档时,视图中的索引将更新结果。
CouchDB-Lucene 项目( github.com/rnewson/Cou… )使用开源搜索引擎 Lucene 和 CouchDB 提供全文搜索功能。
在 Cassandra 中建立索引
面向列的数据库(如 HBase 和 Hypertable)具有默认的基于行键的顺序和索引。列值上的索引(通常称为辅助索引)在这些数据库中通常不能开箱即用。HBase 对辅助索引有一些最小化的支持。Hypertable 打算在其1.0版本发布时支持二级索引,该版本将在今年晚些时候发布。
Cassandra 是面向列的数据库和纯键/值数据存储的混合体。它吸收了来自 Google Bigtable 和 Amazon Dynamo 的想法。与面向列的数据库一样,Cassandra 默认支持基于行键的顺序和索引。此外,Cassandra 还支持辅助索引。
用一个简单的例子解释了 Cassandra 中对二级索引的支持。
接下来,使用 Cassandra 发行版的 bin 目录中的 Cassandra 程序启动 Cassandra 服务器。然后使用 CLI 连接到 Cassandra,如下所示:
CarDatastore 应该已经在本地数据库中了,如果没有,根据需要设置密钥空间和列族。安装完成后,将 CarDatastore 设置为当前密钥空间如下:
使用以下命令验证您先前添加的数据是否存在于本地 Cassandra 数据存储中:
Cars 列家族有两列: make 和 model。若要使通过 make 列中的值进行查询更有效,请对该列中的值创建辅助索引。因为该列已经存在,所以修改定义以包含索引。您可以按以下方式更新 column-family 和 column 定义:
Update 命令在列 make 上创建了一个索引。创建的索引类型为 KEYS 类型。Cassandra 定义了一个 KEYS 类型索引,类似于键/值对的简单散列。
现在,查询所有具有丰田制造价值的值。使用的 SQL 的语法如下:
[defaulteCarDataStore] get cars where make ='toyota';
---------------------------------------------------
RowKey: Prius
=>(column=make, value=toyota,timestamp=1301824068109000)
=> (column=model, value=prius 3, timestamp=1301824129807000)
---------------------------------------------------
RowKey:Corolla
=>(column=make,value=toyota,timestamp=1301824154174000)
=> (column=model, value=le, timestamp=1301824173253000)
2 Rows Returned.
尝试另一个查询,但是这次通过 Prius 3的型号值过滤汽车数据,如下所示:
通过 make 进行过滤的查询工作顺利,但通过模型进行过滤的查询失败。这是因为 make 上有索引,而 model 上没有。尝试另一个将 make 和 model 组合在一起的查询,如下所示:
索引再次工作,因为至少有一个筛选条件具有一组索引值。
手边的示例在其列中没有任何数值,因此显示大于或小于筛选器是不可能的。但是,如果您确实希望利用一个过滤器来处理这种基于不等式比较器的查询,那么您将会很不走运。目前,KEY 索引不具备执行范围查询的能力。如果 Cassandra 包含 B 树或类似的索引类型,将来可能会支持通过索引进行范围查询。基本的 KEYS 索引不足以进行范围查询。
本文正在参加「金石计划 . 瓜分6万现金大奖」