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

不适合使用索引的情况

  1. 数据不超万条时,不需要使用索引。性能的提升并不明显,而大大增加了内存和硬盘的消耗。
  2. 查询数据超过表数据量30%时,不要使用索引字段查询。实际证明会比不使用索引更慢,因为它大量检索了索引表和我们原表。
  3. 数字索引,要比字符串索引快的多,在百万级甚至千万级数据量面前,使用数字索引是个明确的选择。
  4. 把你经常查询的数据做成一个内嵌数据(对象型的数据),然后集体进行索引。

参考文章

  1. https://jspang.com/detailed?id=36