Mysql和Mongodb对比

Mysql和Mongodb对比

Posted by Lerko on August 17, 2020

存储和查询

数据库 存储类型 查询
mysql 行存储 sql
mongodb 文档存储 json形式

索引

mongodb

索引类型 数据结构 特性
单列索引 B-tree MongoDB可以在任何一个字段中创建索引,默认情况
下,所有的集合(collections)会在_id字段中创建索引。,单字段
命中
复合索引 B-tree 复合索引指的是将多个key组合到一起创建索引,这样可
以加速匹配多个键的查询。有最左匹配原则,单独使用中间字段进行查
询发使用索引
多键索引 B-tree 针对复杂数据结构。MongoDB使用多键索引为数组的每
个元素都创建索引,多键索引可以建立在字符串、数字等key或者内嵌文档(document)的数组上,
如果索引字段包含数组值,MongoDB会自动确定是否创建多键索引; 您不需要手动指定多键类型。
查询调教中有 索引边界: 交集边界 并集边界
文本索引 B-树 全文索引类型,支持在Collection中搜索字符串内容,
对字符串与字符串数组创建全文可搜索的索引 。
支持指定字段权重
2d 坐标平面 在平面几何(欧几里得几何)中计算距离
2dsphere 球面几何 2dsphere 索引支持在类似地球的球体上计算几何图形的查询
。2dsphere index 支持所有 MongoDB 地理空间查询:
包含查询、交叉查询和邻近查询。
hash索引 hash 散列索引使用散列函数来计算索引字段值的散列值

Mysql

B+tree

为什么mongodb使用B-tree?

首先B+tree和B-tree有什么区别

B-tree

(1)多路,非二叉树

(2)每个节点既保存索引,又保存数据

(3)搜索时相当于二分查找

20200817100142

B+tree:

(1)多路非二叉

(2)只有叶子节点保存数据

(3)搜索时相当于二分查找

(4)增加了相邻接点的指向指针。

20200817100229

两者区别就是:

(1)B+树查询时间复杂度固定是logn,B-树查询复杂度最好是 O(1)。

(2)B+树相邻接点的指针可以大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。

(3)B+树更适合外部存储,也就是磁盘存储。由于内节点无 data 域,每个节点能索引的范围更大更精确

(4)注意这个区别相当重要,是基于(1)(2)(3)的,B-树每个节点即保存数据又保存索引,所以磁盘IO的次数很少,B+树只有叶子节点保存,磁盘IO多,但是区间访问比较好。

MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql。(区间访问弱小于mysql,但是mongodb易于分片)

Mysql作为一个关系型数据库,数据的关联性是非常强的,区间访问是常见的一种情况,B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历。

事务

mysql事务的支持比mongodb好 mongodb隔离性是属于RC(不可重复读),会导致出现幻读和不可重复读,只解决了脏读问题 而mysql的RR(可重复读)中innodb解决了幻读的问题

20200817100621