存储和查询
数据库 | 存储类型 | 查询 |
---|---|---|
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)搜索时相当于二分查找
B+tree:
(1)多路非二叉
(2)只有叶子节点保存数据
(3)搜索时相当于二分查找
(4)增加了相邻接点的指向指针。
两者区别就是:
(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解决了幻读的问题