前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
索引
索引可以提升文档的查询速度,但建立索引的过程需要使用计算与存储资源,在已经建立索引的前提下,插入新的文档会引起索引顺序的重排
MongoDB 在创建集合时,会默认在\_i
d字段上创建唯一索引
该索引可防止客户端插入具有相同字段的两个文档,_id
字段上的索引不能被删除
查询分析
查询过程中的winningPlan
查询计划的stage
属性描述查询命中索引的有关信息
阶段 | 描述 |
---|---|
COLLSCAN | 全表扫描 |
IXSCAN | 索引扫描 |
FETCH | 根据索引去检索指定document |
PROJECTION | 限定返回字段 |
SHARD_MERGE | 将各个分片返回数据进行merge |
SORT | 表明在内存中进行了排序 |
LIMIT | 使用limit限制返回数 |
SKIP | 使用skip进行跳过 |
IDHACK | 针对_id进行查询 |
SHARDING_FILTER | 通过mongos对分片数据进行查询 |
COUNT | 利用db.coll.explain().count()之类进行count运算 |
COUNTSCAN | count不使用用Index进行count |
COUNT_SCAN | count使用了Index进行count |
SUBPLA | 未使用到索引的$or查询 |
TEXT | 使用全文索引进行查询 |
单键索引
创建单键索引
db.records.createTndex({ field:1 })
查看使用索引情况
db.collection.find({field:value}).explain()
复合索引
复合索引结构包含多个字段,支持在多个字段上进行的匹配查询
db.collection.createIndex({ <field1> : <type>, <field2> : <type2>, ...})
查询表达不一定遵循指定的索引的顺序
并且数量上不一定全都满足
多键值索引
为包含数组的字段建立索引称为多键值索引,多键值索引支持对数组字段的高效查询
db.collecttion.createlndex( { <field>: < 1 or -1 > })
全文索引
文本索引支持对字符串内容的文本搜索查询,但是这种索引因为需要检索的文件比较多,因此在使用的时候检索时间较长
一个集合只能有一个文本搜索索引,但该索引可以覆盖多个字段
db.collection.createIndex({ field1: "text", field2: "text" ... })
查询需要使用$text
结合$search
完成
db.collection.find({$text:{$search:"test"}})
全文检索支持语言: https://docs.mongodb.com/manual/reference/text-search-languages/
散列索引
散列索引是指按照某个字段的散列值来建立索引,优势在于等值查询很快,所以只能用于字段完全匹配的查询,不能用于范围查询
db.collection.createlndex( { field : "hashed" })
索引参数
在每个索引的类别上还可以加上一些参数,使索引更加具有针对性,常见的参数包括稀疏索引、唯一索引、过期索引等
后台属性
建索引过程会阻塞其它数据库操作,background
属性可以声明当前建立索引的过程为后台执行
默认值为false
db.collection.createlndex ({ "field" : 1 }, { background : true })
稀疏属性
只检索包含具有索引字段的文档,即使索引字段包含空值,检索时也会跳过所有缺少索引字段的文档,因为索引不包含集合的所有文档,所以说索引是稀疏的
相反,非稀疏索引包含集合中的所有文档,存储不包含索引字段的文档的空值
默认值为 false
db.collection.createlndex ({ "field" : 1 }, { sparse : true })
唯一属性
如果希望建立的索引同样具备唯一属性,那么可以使用unique
db.collection.createlndex ({ "field" : 1 }, { unique: true })
过期属性
MongoDB 可以用来在一定时间或特定时间后从集合中自动删除文档
注意,建立索引的字段应该是一个时间格式,删除动作将判断过期的描述expireAfterSeconds
距设置字段的差值是否满足设定
db.collection.createIndex( { "time_field": 1 }, { expireAfterSeconds: 10 } )
需要注意的是,MongoDB 是每 60s 执行一次删除操作,因此短时间内执行会出现延迟现象
查看索引
查看集合上的所有索引
db.collection.getIndexes()
删除索引
删除某个索引
db.records.dropIndex({ "field" : 1 })
删除全部索引
db.records.dropIndexes()
修改索引
- 删除现有索引
- 重新创建索引
索引限制
索引不能被以下的查询使用:
- 正则表达式及非操作符,如 $nin, $not, 等。
- 算术运算符,如 $mod, 等。
- $where 子句
- 集合中索引不能超过64个
- 索引名的长度不能超过128个字符
- 一个复合索引最多可以有31个字段