介绍
Index
- 合适的索引可以大大提高数据库搜索能力
- 对文档的部分内容进行排序的数据结构
- 加快文档查询和文档排序的速度
类型:单键索引、复合键索引、多键索引
特性:唯一性、稀疏性、生存时间
创建索引
db.collections.createIndex()
# 单键索引
# 给collections表的name创建一个正向排序的索引
db.collections.createIndex({name: 1})
# 复合键索引
db.collections2.createIndex({name: 1,balance: -1})
# 多键索引
db.collections3.createIndex({name: 1})
db.collections3.createIndex({currency: 1})
# 查询表使用的索引
db.collections.getIndexes()
数组中的每一个元素都会在多键索引中创建一个键
创建唯一性索引
# 如果这个文档中的balance 字段重复了,唯一性索引会创建失败
# 如果新创建文档中不包括这个唯一性索引字段,只有第一篇会被写入,并赋值null
db.accounts.createIndex({balance,1},{unique: true})
稀疏性:复合键索引也可以具有稀疏性。如果文档中没有完全包含复合键里的字段,文档不会被加入索引中。
索引的生存时间:针对日期字段,或者包含日期元素的数组字段,可以使用设置生存时间的索引,自动删除超过生存时间的索引文档。(如果是数组,会使用数组中最小时间来计算过期时间)(复合键索引,不具备生存时间特性)(后台线程检测文档的过期时间,删除可能存在一定的延迟)
# 文档会在 lastAccess 字段时间的20秒后删除
db.accounts.createIndex({lastAccess: 1},{expireAfterSeconds: 20})
索引的效果
db.collection.explain()
可以进行分析的命令包括:aggregate(),count(),distinct(),find(),group(),remove,update()
db.collections2.explain().find().sort({name: 1, balance: -1})
分析效果介绍 winnigPlan 下 stage
COLLSCAN 代表需要遍历全表(不太好的查询)
IXSCAN 使用索引字段查询
SORT 使用未创建索引字段进行排序
删除索引
db.collections.dropIndex()
如果想修改索引,需要先删除原文档索引,再创建新索引。(否则原文档不会包含新的索引)
# 查询所有索引
db.accounts.getIndexes()
# 按照索引名删除索引
db.accounts.dropIndex("name_1")
# 使用索引定义删除索引
db.accounts.dropIndex({"name": 1,"balance": -1})