MongoDB事务和索引!

事务

3.0版本中,引入WiredTiger存储引擎,开始支持单文档事务

4.0版本中,开始支持多文档事务,以及副本集(主从复制)架构下的事务

4.2版本中,开始支持分片集群、分片式多副本集架构下的事务

类比MySQLMongoDB支持了分片集群中的事务,而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-explaintype字段

代表着本次语句的查询类型,该字段可能会出现以下值:

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