MongoDB_索引
来源:互联网 发布:绝地求生多线程优化 编辑:程序博客网 时间:2024/05/24 22:41
索引概述
① 索引数量:
在一个特定的集合上,不应该拥有两个以上的索引。对于添加的每一个索引,每次的写操作都将耗费更多的时间。② 索引基数:
集合中某个字段拥有不同值的数量。应该在基数比较高的键上建立索引。或者至少应该把基数较高的键放在复合索引的前面。③ 何时不应该使用索引:
结果集在原集合中所占的比例越大(30%),索引的速度就越慢,这时应该考虑不使用索引。索引类型
① 唯一索引:
可以确保集合的每一个文档的指定键都有唯一值。
索引储桶的大小是有限制的,如果一个文档的字段由于太大(大于1024字节)不能包含在索引里,MongoDB不会返回任何错误或警告。② 复合索引:在多个键上建立的索引
db.speeches.ensureIndex({“age”:1,”username”:-1})
③ 复合唯一索引:创建复合唯一索引时,单个键的值可以相同,但所有键的组合值必须是唯一的。对已有的集合上创建唯一索引时可能会失败,因为集合中可能已经存在重复的值了。创建索引时使用“dropDups”选项,如果遇到重复的值,第一个会被保留,之后的重复文档都会被删除。对于比较重要的数据,千万不要使用“dropDups”
db.people.ensureIndex({“username”:1},{“unique”:true,“dropDups”:true})
④ 稀疏索引:希望唯一索引只对包含相应键的文档上生效,这时可以将unique与sparse选项组合在一起使用,创建稀疏索引
db.people.ensureIndex({“username”:1},{“unique”:true,“sparse”:true} )
稀疏索引不必是唯一的,只要去掉unique选项,就可以创建一个非唯一的稀疏索引
⑤ 多键索引:对于某个索引的键,如果这个键在某个文档中是一个数组,那么这个索引就会被标记为多键索引。
⑥ 覆盖索引:
当一个索引包含用户请求的所有字段,可以认为这个索引覆盖了本次查询,应该优先使用覆盖索引。
隐式索引:
如果有一个拥有N个键的索引,那么同时也得到了所有这N个键的前缀组成的索引。⑦ 索引嵌套文档:
允许深入文档内部,对嵌套字段和数组建立索引。db.users.ensureIndex({“loc.city”:1})
索引数组:
对数组建立索引,实际上是对数组的每一个元素建立一个索引条目。因此数组索引的代价比单值索引高:对于单次插入、更新或者删除,每一个数组条目可能都需要更新。一个索引中的数组字段最多只能有一个。⑧ TTL索引
如果一个文档的某个字段,如“lastUpdated”存在并且它的值是日期类型,当服务器时间比文档的“lastUpdated”字段的时间晚expireAfterSecs秒时,文档就会被删除。为了防止活跃的会话被删除,可以在会话上有活动发生时将“lastUpdated”字段的值更新为当前时间。db.foo.ensureIndex({“lastUpdated”:1},{“expireAfterSecs”:60*60*24})
⑨ 全文本索引
创建全文本索引的成本特别高。
MongoDB会使用OR连接查询中的每个词,这是执行全文本查询最有效的方式
优化全文本搜索:创建一个由其他查询条件前缀和全文本字段组成的复合索引⑩ 地理空间索引
索引管理
对于一个集合,每个索引只需要创建一次,所有的数据库索引信息都存储在system.indexs集合中。只能通过ensureIndex或者dropIndexes对其进行操作。
标识索引:
索引名称的长度是有限制的,新建复杂索引时可能需要自定义索引名称{“name”:“alphabet”}。调用getLastError就可以知道索引是否成功创建。修改索引:
使用dropIndex命令删除不需要的索引。新建索引时,MongoDB会阻塞所有对数据库的读请求和写请求,一直到索引创建完成。如果希望数据库在创建索引的同时仍然可以处理读写请求,可以在创建索引时指定background选项。在已有的文档上创建索引会比新创建索引在插入文档快一点。使用explain() 调用可以查看与查询相关的信息
hit()强制MongoDB使用特定的索引进行查询
hint({“$natural”:1})强制做全表扫描,不使用索引查询优化器:如果一个索引能够精确匹配一个查询,那么优化器就会使用这个索引。如果有几个索引都适合你的查询,MongoDB会从这些可能的索引子集中为每次查询计划选择一个,这些查询计划是并行执行的,最早返回100个结果的就是胜者,其他的查询计划就会被中止。这个查询计划会被缓存,这个查询接下来都会使用它,直到数据集发生了较大变化。
- MongoDB_索引
- MongoDB_索引
- MongoDB_排序
- Mongodb_技巧
- mongodb_权限
- MongoDB_基础知识
- MongoDB_分片
- MongoDB_管理
- mongodb_创建、删除、更新
- mongodb_创建、删除、更新 .
- mongodb_复制与备份
- MongoDB_条件操作符
- MongoDB_类型操作符
- MongoDB_逻辑操作符
- mongodb_修改器
- mongodb_导入导出数据
- Mongodb_文件存储
- MongoDB_应用程序设计
- map-side-join /Reduce-side-join
- Java从SFTP服务器下载文件
- Android ADB 一些常用命令
- 文章标题
- 遇见kafka
- MongoDB_索引
- Java 内存区域和GC机制
- 内存泄漏分析之-内存分析工具的使用
- Andrew Ng机器学习笔记week4、5 神经网络
- HTML5(动画)
- 2018中兴回寄三方
- Appium Desktop-启动异常Permission to start activity denied.
- 从一个html页面传值到另一个页面,两个html之间的值传递(js location.search用法)
- Redis学习指南