博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MongoDB string字段索引策略
阅读量:6077 次
发布时间:2019-06-20

本文共 1838 字,大约阅读时间需要 6 分钟。

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

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查询的时候才会用到:

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是对所有的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索引可以同时建立,以满足不同查询需求

转载地址:http://scagx.baihongyu.com/

你可能感兴趣的文章
详解环保数采仪功能应用
查看>>
解决克隆系统网卡名字不是默认eth0的问题
查看>>
Nginx访问控制和虚拟主机
查看>>
账户管理
查看>>
Linux本地数据上传到阿里云OSS
查看>>
Java局部变量
查看>>
MaxCompute Spark开发指南
查看>>
147.使用 editplus 连接 Linux系统
查看>>
Redis 的安装配置介绍
查看>>
红米5.0以上手机一键激活XPOSED框架的经验
查看>>
除了FineBI,国内还有哪些比较好的BI产品
查看>>
信修修:显示器黑屏无信号 但电脑一直在运行的原因和解决办法
查看>>
RAID阵列
查看>>
使用libsvm进行文本分类
查看>>
Windows server 2003到Windows server 2008 R2的迁移本地升级
查看>>
项目中应用eventbus解决的问题
查看>>
Android中使用Sqlite数据库 (一) 建表
查看>>
2-05 使用固态存储SSD或PCIe卡
查看>>
【转】如何在LINUX中安装下载到的软件
查看>>
随机密码生成工具
查看>>