MongoDB事务和索引!
MongoDB事务和索引!
月伴飞鱼事务
3.0版本中,引入WiredTiger存储引擎,开始支持单文档事务
4.0版本中,开始支持多文档事务,以及副本集(主从复制)架构下的事务
4.2版本中,开始支持分片集群、分片式多副本集架构下的事务类比
MySQL,MongoDB支持了分片集群中的事务,而MySQL只支持主从集群下的事务,并不支持分库环境下的事务
MongoDB不适用于强事务的场景,原因如下:
MongoDB的事务必须在60s内完成,超时将自动取消(因为要考虑分布式环境)涉及到事务的分片集群中,不能有仲裁节点
事务会影响集群数据同步效率、节点数据迁移效率
多文档事务的所有操作,必须在主节点上完成,包括读操作
索引
官方文档:https://www.mongodb.com/docs/manual/indexes
早版本的
MongoDB中,索引底层默认使用B-Tree结构
4.x版本后,MongoDB推出了V2版索引,默认使用变种B+Tree来作为索引的数据结构(和MySQL索引的数据结构相同)复合索引:
- 指基于多个字段创建的索引
唯一索引:
- 基于唯一索引查找数据时,找到第一个满足条件的数据,就会立马停止匹配
部分索引:
- 使用字段的一部分开创建索引,要结合
partialFilterExpression选项来实现TTL索引:
- 可以基于它实现过期自动删除的效果
- 主要依靠
expireAfterSeconds选项来创建,不过只能在Date、ISODate类型的字段上,建立TTL索引为什么
TTL索引必须基于Date类型的字段创建?
- 因为
MongoDB会使用该字段的值,作为计算的起始时间- 如果在一个
Date数组类型的字段上建立TTL索引,MongoDB会使用其中最早的时间来计算过期时间
Explain工具
执行
explain命令,输出了特别多的信息,主要关注stage这个值,类似于MySQL-explain的type字段代表着本次语句的查询类型,该字段可能会出现以下值:
COLLSCAN:扫描整个集合进行查询IXSCAN:通过索引进行查询COUNT_SCAN:使用索引在进行count操作COUNTSCAN:没使用索引在进行count操作FETCH:根据索引键去磁盘拿具体的数据SORT:执行了sort排序查询LIMIT:使用了limit限制返回行数SKIP:使用了skip跳过了某些数据IDHACK:通过_id主键查询数据SHARD_MERGE:从多个分片中查询、合并数据SHARDING_FILTER:通过mongos对分片集群执行查询操作SUBPLA:未使用索引的$or查询TEXT:使用全文索引进行查询PROJECTION:本次查询指定了返回的结果集字段(投影查询)










