MongoDB数据库中索引的整理与总结
索引是对数据库表中一列或多列的值进行排序的一种结构。
当数据量相当大时,建立合适的索引可以很大的提高查询性能。索引需要消耗硬盘和内存资源,所以要根据程序需要进行建立,MongoDB对索引数量进行了限制,只允许建立64个索引值。
建立索引
语法:db.集合名.ensureIndex({字段名:1})
1:代表键的索引按升序存储
-1:代表键的索引按降序存储
text:代表全文索引
eg: db.randomInfo.ensureIndex({username:1})
功能描述:在randomInfo集合中的username字段上建立索引。
查看现有索引
语法:db.集合名.getIndexes
eg: db.randomInfo.getIndexes()
功能描述:查看randomInfo集合中的所有索引
删除索引
语法:db.集合名.dropIndex(索引的唯一ID)
索引的唯一ID是指:索引查询表中的name值
eg: db.randomInfo.dropIndex('randNum0_1');
功能描述:删除randomInfo集合中的randNum0_1索引
指定索引的名称
语法:db.集合名.ensureIndex({索引字段:1},{"name":"指定的索引名称"})
eg: db.user.ensureIndex({"username":1},{"name":"userindex"})
功能描述:为user集合中的username字段建立索引并且重命名为userindex。
唯一索引
在缺省情况下创建的索引均不是唯一索引。唯一索引的字段在后期插入时字段值不能重复。
语法:db.集合名.ensureIndex({索引字段:1},{"unique":true})
eg: db.user.ensureIndex({"userid":1},{"unique":true})
功能描述:如果再次插入 userid 重复的文档时,MongoDB 将报错,以提示插入重复键。
复合索引
复合索引是指两条以上的索引,MongoDB的复合查询是按照索引顺序进行查询的,即用db.集合名.getIndexes()查询出的数组。想要用到复合索引,需要在查询条件中包含多个索引字段。
指定索引查询(hint)
使用指定的索引进行优先查询
语法:db.集合名.find({查询条件}).hint({指定的索引字段})
eg: db.randomInfo.find({username:'7xwb8y3',randNum0:565509}).hint({randNum0:1});
功能描述:randomInfo集合中有username、randNum0两个索引字段,在查询时优先查询randNum0字段
建立全文索引
全文索引:使用场景为需要在大篇幅的文章中搜索关键词。
语法:db.集合名.ensureIndex({字段名:'text'})
text:代表全文索引
eg: db.info.ensureIndex({contextInfo:'text'})
功能描述:为info集合中的contextInfo字段建立全文索引。
$text修饰符
$text:表示要在全文索引中查东西。
$search修饰符
$search:后边跟查找的内容。
全文索引查找
1. 查询单个词语
db.info.find({$text:{$search:"programmer"}})
功能描述:查询含有programmer单词的文章
2. 查询多个词语(或的关系)
db.info.find({$text:{$search:"programmer family diary drink"}})
功能描述:查询含有programmer 单词、family 单词、diary 单词和drink单词的文章。
3. 除去指定词进行全文查询(非的关系)
db.info.find({$text:{$search:"programmer family diary -drink"}})
功能描述:查询含有programmer 单词、family 单词和diary单词并且不含drink单词的文章。
4. 转义符:
db.info.find({$text:{$search:"\"love PlayGame\" drink"}})
功能描述:查询含有love PlayGame词和drink单词的文章
索引的一些参数
参数 | 值 | 描述 |
---|---|---|
background | boolean | 建索引过程会阻塞其他数据库操作,background可指定以后台运行的方式创建索引,可选,默认值为false |
unique | boolean | 建立的索引是否唯一。true表示创建唯一索引,默认值为false |
name | string | 索引的名称,如果未指定,MongoDB会通过连接索引的字段名和排序顺序生成一个索引名称 |
dropDups | boolean | 在建立唯一索引时是否删除重复记录,指定true创建唯一索引,默认值为false |
不适合使用索引的情况
- 数据不超万条时,不需要使用索引。性能的提升并不明显,而大大增加了内存和硬盘的消耗。
- 查询数据超过表数据量30%时,不要使用索引字段查询。实际证明会比不使用索引更慢,因为它大量检索了索引表和我们原表。
- 数字索引,要比字符串索引快的多,在百万级甚至千万级数据量面前,使用数字索引是个明确的选择。
- 把你经常查询的数据做成一个内嵌数据(对象型的数据),然后集体进行索引。
参考文章
- https://jspang.com/detailed?id=36