面试题答案
一键面试适合创建二级索引的场景
- 复杂查询场景:当需要根据多个字段组合进行查询,而不是仅基于文档的主键(_id)查询时。例如,在一个电商系统中,要查询特定价格区间内且属于某一分类的商品文档,这就需要基于价格和分类字段创建二级索引。
- 频繁查询特定字段组合:如果在业务逻辑中有频繁的对特定字段组合的查询需求。比如在日志系统中,经常需要查询某段时间内且特定级别(如ERROR级别)的日志记录,此时基于时间和日志级别字段创建二级索引能显著提升查询效率。
- 排序需求:当需要按照非主键字段进行排序返回结果时。例如,在博客系统中,希望按照文章的阅读量对文章文档进行排序展示,就需要对阅读量字段创建二级索引以加快排序速度。
通过CouchDB视图实现二级索引优化文档存储性能的方法
- 定义视图函数:在CouchDB中,视图是通过MapReduce函数定义的。首先编写Map函数,它的作用是遍历文档并输出键值对。键通常是你想要建立索引的字段或字段组合,值可以是相关文档的部分数据或其他有用信息。例如,假设文档结构如下:
{
"_id": "doc1",
"title": "文章标题",
"category": "技术类",
"views": 100
}
如果要基于category
和views
字段创建二级索引,Map函数可能如下:
function(doc) {
if (doc.category && doc.views) {
emit([doc.category, doc.views], doc.title);
}
}
- 创建视图:将上述Map函数(可能还会配合Reduce函数,若有聚合需求,比如计算每个分类的文章平均阅读量等),通过CouchDB的API(如HTTP API)创建到相应的数据库中。可以使用工具如
curl
命令:
curl -X PUT http://localhost:5984/your_database/_design/your_design_doc -d '
{
"views": {
"your_view": {
"map": "function(doc) { if (doc.category && doc.views) { emit([doc.category, doc.views], doc.title); } }"
}
}
}'
- 使用视图进行查询:创建好视图后,就可以通过视图进行查询,实现类似二级索引的功能。例如,要查询
category
为“技术类”且views
大于100的文档,可通过如下的HTTP请求:
curl -G http://localhost:5984/your_database/_design/your_design_doc/_view/your_view \
--data-urlencode 'startkey=["技术类",100]' \
--data-urlencode 'endkey=["技术类",{"$gt":100}]'
这样通过视图实现的二级索引,CouchDB能够更高效地定位和检索文档,从而优化文档存储性能。