MongoDB string字段索引策略总结

学习MongoDB的索引时发现一个奇怪的问题,给一个string类型的field设置text索引,但是在查询的时候并没有使用索引。比如:

db.tomcat_access_logs.ensureIndex( { url : ’text’ });

db.tomcat_access.logs.find( { url : ’1’ } ).explain();

db.tomcat_access_logs.find( { url : /1/ } ).explain();

{

"cursor" : "BasicCursor",

"isMultiKey" : false,

"n" : 0,

"nscannedObjects" : 100,

"nscanned" : 100,

"nscannedObjectsAllPlans" : 100,

"nscannedAllPlans" : 100,

"scanAndOrder" : false,

"indexOnly" : false,

"nYields" : 0,

"nChunkSkips" : 0,

"millis" : 0,

...

}

从explain()的结果可以发现,在查询的时候只用了BasicCursor,也就是说没有使用索引。

后发现只有当使用$text查询的时候才会用到text索引:

db.tomcat_access_logs.find( { $text : { $search : ’1’} } ).explain();

{

"cursor" : "TextCursor",

"n" : 0,

"nscannedObjects" : 0,

"nscanned" : 0,

"nscannedObjectsAllPlans" : 0,

"nscannedAllPlans" : 0,

"scanAndOrder" : false,

"nYields" : 0,

"nChunkSkips" : 0,

"millis" : 0,

...

}

只不过这样的话,就没有办法针对某个特定field进行查询了,因为$text是对所有text索引的field进行的全文搜索。此时只需要做一般的索引即可:

db.tomcat_access_logs.ensureIndex( { url : 1 } );

db.tomcat_access.logs.find( { url : ’1’ } ).explain();

db.tomcat_access.logs.find( { url : /.*1.*/g } ).explain();

{

"cursor" : "BtreeCursor url_1",

"isMultiKey" : false,

"n" : 0,

"nscannedObjects" : 0,

"nscanned" : 100,

"nscannedObjectsAllPlans" : 0,

"nscannedAllPlans" : 100,

"scanAndOrder" : false,

"indexOnly" : false,

"nYields" : 0,

"nChunkSkips" : 0,

"millis" : 1,

"indexBounds" : {

"url" : [

[

"",

{

}

],

[

/.*1.*/,

/.*1.*/

]

]

},

...

}

总结

1.使用db.collection.find( { url : ’1’} )或者db.collection.find( { url : /.*a.*/} ),不会使用的text索引,而是一般索引。

2.建立了text索引后,只能对text索引包含的所有字段进行全文搜索,无法对某个字段进行搜索

3.一般索引和text索引可以同时建立,以满足不同查询需求

原文来自:segmentfault

时间: 2024-10-13 16:36:48

MongoDB string字段索引策略总结的相关文章

MongoDB数据模型和索引学习总结

MongoDB数据模型和索引学习总结 1. MongoDB数据模型: MongoDB数据存储结构: MongoDB针对文档(大文件採用GridFS协议)採用BSON(binary json,採用二进制编码)数据格式来存储和交换数据.Bson吸收了JSON schema-less的特点,存储结构松散,不须要像RDB(关系数据)那样事先定义数据存储的元数据结构.另外添加了多种数据类型的支持和优化,使读写更加高效. (1) BSON 支持的数据类型: Double.String.Object.Arra

MongoDB 基础(三)mongodb 中的索引使用

MongoDB中的索引和其他数据库索引类似,也是使用B-Tree结构.MongoDB的索引是在collection级别上的,并且支持在任何列或者集合内的文档的子列中创建索引. 下面是官方给出的一个使用索引查询和排序的一个结构图. 所有的MongoDB集合默认都有一个唯一索引在字段"_id"上,如果应用程序没有为 "_id"列定义一个值,MongoDB将创建一个带有ObjectId值的列.(ObjectId是基于 时间.计算机ID.进程ID.本地进程计数器 生成的)

使用NOSQL的MongoDB时建立索引需要注意的几点建议和Explain优化分析

第一,MongoDB索引和MySQL索引非常相似并且对于MySQL的索引优化有很多也适用于MongoDB. 第二,更重要的是,这些索引的建立对你的应用提高也是有限的. 对于应用的最佳索引策略应该基于很多的重要因素.包含了你期望查询的类型, 数据读取与写入的比率,甚至于你服务器的空闲内存.意思就是, 需要对线上的产品做很多的测试剖析工作,才能调整出最佳的索引策略. 没有什么好的方法可以替代实际经验的. 索引策略 下面有些索引的基本法则 创建的索引要匹配查询. 如果你仅仅要查询单个字段.索引这个字段

MongoDB的常规备份策略

MongoDB的常规备份策略1 冷备份--复制数据库文件2 mongodump/mongorestore 除了mongodump/mongorestore之外还有一对组合是mongoexport/mongoimport 区别: mongoexport/mongoimport导入/导出的是JSON格式,而mongodump/mongorestore导入/导出的是BSON格式. JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性. BSON格式即mongodump/mo

高性能的索引策略(上)

高效的选择和使用索引有很多方式,其中有些事针对特殊案例的优化方法,有些则是针对特定行为的优化,使用哪个索引,以及如何评估选择不同索引性能影响的技巧,则需要持续不断的练习.接下来将介绍如何高效的使用索引. 独立的列 我们通常会看到一些查询不当的使用索引,或者是的MySQL无法使用已有的索引.如果查询中的列不是独立的,则MySQL就不会使用索引.“独立的列”是指索引列不能是表达式的一部分,也不能是函数的参数. 例如,下面的这个查询无法使用actor_id的索引: SELECT actor_id FR

2、MongoDB学习之索引的管理

目标:实现索引的创建.查询.删除.explan管理等操作 环境: > db.version() 3.4.7 索引创建满足的基本需求: 1:索引提高查询速度 2:在mongodb中,索引可以按自动列升序/降序来创建,便于排序 3:默认是用btree来组织索引文件,2.4版本以后,也允许建立hash索引 管理索引常用到的语法有: db.c1.createIndex(keypattern[,options])    #keypattern表示索引匹配的字段列,例如name:1 表示那么列升序建立索引,

MySQL索引背后的之使用策略及优化(高性能索引策略)

为了讨论索引策略,需要一个数据量不算小的数据库作为示例.本文选用MySQL官方文档中提供的示例数据库之一:employees.这个数据库关系复杂度适中,且数据量较大.下图是这个数据库的E-R关系图(引用自MySQL官方手册): 图12 MySQL官方文档中关于此数据库的页面为http://dev.mysql.com/doc/employee/en/employee.html.里面详细介绍了此数据库,并提供了下载地址和导入方法,如果有兴趣导入此数据库到自己的MySQL可以参考文中内容. 最左前缀原

MongoDB学习笔记~索引提高查询效率

索引这个东西大家不会陌生,只要接触到稍微大一点的数据,都会用到这东西,它可以提升查询的速度,相当代价就是占用了更多的存储空间,这也是正常的,符合“能量守恒定理”,哈哈!今天说的是MongoDB里的索引,在我进行对500万数据进行查询测试时,发现如果你的查询字段不加索引,那是相当恐怖的,一个简单的查询(单字段)要耗时30多秒,这种操作,基本可以认为服务器挂了,哈哈!当为字段加了索引之后,查询速度为ms级,100毫秒以内的速度真是把经兴奋坏了,呵呵! 建立索引 db.tableName.ensure

mongodb学习(六)索引

准备工作: 先插入100万条数据 for(i=0;i<=1000000;i++){ db.users.insert({ "i":i, "username":"user"+i, "age":Math.floor(Math.random()*120), "created":new Date() }) } 1. 创建索引: 数据量越大创建索引时间越长 db.users.ensureIndex({"