MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致。由于集合中的键(字段)可以是普通数据类型,也可以是子文档。MongoDB可以在各种类型的键上创建索引。
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
MongoDB的索引就是集合Collection里面的Key字段,一般默认都会有一个默认索引_id,这是唯一也是不能被删除的索引。也可以自己手动给某个索引指定唯一性:
MongoDB索引分为7类:
1、默认索引(_id)
MongoDB有个默认的“_id”的键,他相当于“主键”的角色。集合创建后系统会自动创建一个索引在“_id”键上,它是默认索引,索引名叫“_id_”,是无法被删除的,_id值也是恒定不变的。
2、单键索引
索引值为一个单一的值,比如字符串,更新日期等等。
3、多键索引
索引值为多个值同时存在,例如数组。
4、复合索引
单键索引和多建索引的结合。
5、过期索引
在一段时间后会过期(自动销毁记录)的索引,适合用于处理用户登录信息等具有时间局限的记录过期处理(比较多的做法是Session或者cookie),对一些存储日志的过期处理等等用途。
存储的字段值必须是指定的时间类型ISODate或者是ISODate数组,不能使用时间戳,否则索引会失效。
记录自动销毁进程是每60S跑一次的后台程序,并不是很准时的自动程序。
如果指定了ISODate数组,那么程序会自动吧数组内时间最早的那条记录销毁掉。
过期索引不能被复合索引所引用。
6、全文索引
主要用于搜索业务的索引,通过多种不同的查询方式和条件进行MongoDB全文索引,适合搜索引擎和站内搜索业务。
MongoDB全文索引目前不支持中文。
在实际应用上,MongoDB的全文索引由于不支持中文索引,因此单单依靠MongoDB进行全文索引支持搜索业务的效率和成本是很高的,一般来讲业内是不建议使用MongoDB进行全文索引的,除非MongoDB官方能增加对中文索引的支持,不然,MongoDB更多的还是停留在数据仓库的角色。
全文索引有四种查询方式:
6.1、查询单条记录:
db.school.find({$text:{$search: 'leader'}})
6.2、用空格隔开实现多字段索引查询(或查询):
db.school.find({$text:{$search: 'suck test'}})
查询的结果是包含suck的记录和包含test记录的合集
6.3、取反查询,减号-可以使得查询结果不能含有指定字段:
db.school.find({$text:{$search: 'mongodb -human'}})
查询的结果是包含mongodb但不包含 human的记录
6.4、用\"
来实现且查询(并列查询):
db.school.find({$text:{$search: '\"noSql \"leader'}})
结果就是既包含noSql又包含leader的记录
7、地理位置索引
根据区间值进行范围索引查询,这种索引适合于当前越来越流行的打车软件查询人车位置时通过索引提升查询效率,还有网购点餐时查询距离自己范围内的餐厅地址等等。
索引的最终目标是提升查询效率和速度,索引不能过多,需要理性创建最适合的。