索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
MongoDB使用 createIndex() 方法来创建索引。
1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
db.persons.createIndex({"name":1})Code language: JavaScript (javascript)
createIndex() 方法中也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。
db.person.createIndex({"name":1,"age":-1})Code language: JavaScript (javascript)
补充说明
- createIndex() 在集合已存在索引的情况下不会重复创建,除非指定 unique 等选项不同
- 从 MongoDB 3.0 开始,ensureIndex() 已被废弃,统一使用 createIndex()
- 复合索引字段的顺序很重要,遵循最左前缀原则:查询条件只有 name 时能用上该索引,只有 age 时不能
- 索引虽然加快查询,但会占用磁盘空间,并且每次写入(插入、更新、删除)都需要同步维护索引,有性能开销
- 查看集合已有索引:
db.persons.getIndexes()Code language: CSS (css)
- 删除索引:
db.persons.dropIndex({"name":1})Code language: JavaScript (javascript)
或按索引名称删除:
db.persons.dropIndex("name_1")Code language: CSS (css)
- 创建唯一索引,防止字段值重复:
db.persons.createIndex({"name":1}, {unique: true})Code language: JavaScript (javascript)
- 后台创建索引,不阻塞其他操作(生产环境推荐):
db.persons.createIndex({"name":1}, {background: true})Code language: JavaScript (javascript)