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
:本次查询指定了返回的结果集字段(投影查询)