标签:提升 链表 树结构 read myisam 读写 mmap 成本 http
关系型数据库:MySQL,Oracle,Postgrel, MariaDB, SQL Server等
非关系型数据库(Not Only SQL):Redis,Memcached, MongoDB, Hbase等
B+树结构如下:
Mysql5.7新变化特性有:
Mysql 8.0变化特性有:
RU(readuncommited)未提交读; 缺陷:不可重复读现象
RC(read commited) 提交读; 缺陷:脏读
RR(repeatable read) 可重复读; 缺陷:虚读/幻读
MVCC (多版本并发控制)
基本原理:某个时间点快照
InnoDB 中MVCC是如何实现的?
MVCC适用场景:RC、RR
MySQL中MVCC 特性:写锁存在,只利用其中的读非阻塞
问题:知道mysql的事务隔离吗?/事务隔离分哪几个级别?/事务隔离性怎么保证/...
回答思路:
思路串联:
事务ACID-->事务隔离级别及分析-->MySQL事务隔离特性(留MVCC和GapLock引子)
示例答案:
数据库支持事务本身需要有具备四个特性:原子性、一致性、隔离性和持久性,也即ACID。其中事务的隔离性简单来说就是并发执行的多个事务之间互不干扰。
? 事务隔离总体分为四个级别:第一个是RU(未提交读),该级别事务内容易出现脏读的情况,即事务A读到了事务B没有提交的数据;为了解决脏读问题,可以提高事务隔离级别到RC(提交读),此时事务A不会读到其他事务未提交的数据,但又产生了一个新的现象:事务A执行的过程中,有可能另外一个事务B提交了数据,此时事务读取的数据和之前不一致,即出现了不可重复读的问题;所以mysql的InnoDB本身默认采用了第三个事务隔离级别RR(可重复读),该级别使用MVCC(多版本并发控制)解决重复读的问题,一般的RR级别会出现幻读的问题,及同一个事务多次执行同一个select,读取到的数据行发生了改变,这是因为数据行发生了行数减少或者新增;而最高的事务隔离级别是SE(可序列化),该方式下事务相当于串行执行,解决了脏读、不可重复读、幻读等问题,但对性能和效率的影响很大,生产环境中很少会使用该隔离级别;
? 具体到mysql中,mysql默认的RR级别有一些特别,因为其引入了GAP LOCK(间隙锁)的概念,可在RR级别即可解决幻读的问题;另外一个特性是mysql里的MVCC只解决读-写的阻塞问题,写-写依然还是阻塞的。
WiredTiger:
3.2版本默认存储引擎都改为了wiredtiger
特性:
Rocksdb:
特性:
MongoDB 3.0特性(2015年):
特性:
MongoDB 4.0特性(2018年6月):
特性:
空间局部性原理
B树:
B树(4阶)结构如下:
海量数据读写,频次高 -- MongoDB
关系型结构较多,应用场景事务要求高 -- MySQL
其他:成本、意愿、技术栈
常见的扩展方法:
a. 水平扩展:分库,分collection
b. 垂直扩展:分片(类似于mysql中分区)
Bloom Filter算法:
对于有n个元素的集合S={x1, x2,……,xn},我们用k个哈希函数(h1,h2,……,hn),分别将S中的每一个元素映射到一个m位的位数组(bm-1bm-2……b1b0)中。该位数组在初始化时所有置为0,每当用哈希函数映射到该位时则将该位置为1。对于已经置为1的位则不在反复置1。
如下图展示x1,x2, x3的插入过程:
查找时性能:
OLTP(on-line transaction processing ): 联机事务处理
OLAP(on-line Analytical Processing):联机分析处理
交易性数据库:oracle、sqlserver、mysql
分析性数据库:hbase、hive、clickhouse
一般使用列式数据库:
行存储:数据存储一行接一行;
列存储:一列的所有数据放一起;
问题:MySQL和MongoDB区别?
思路:
思路串联:
MySQL存储引擎及结构介绍--MongoDB存储引擎及结构介绍-->MySQL和MongoDB区别(夹杂时间线)--> DB选型因素--> 埋下一个问题引子(事务相关)
示例答案:
? MySQL是关系型数据库的一种,其存储引擎有MyISam, InnoDB,Merge等,目前在业界中大多使用的支持事务InnoDB存储引擎,从15年MySQL5.7开始,MySQL开始支持json格式(开始向nosql数据库靠近);而MongoDB去年8月份发布的最新版本4.0开始支持多文档事务,当前其默认的存储引擎wiredtiger性能非常卓越;
? mysql和MongoDB数据库发展越来越类似,都在取其精华,在具体的数据库选型时,两种DB底层的实现机制可能是一大考虑因素。mysql索引底层是用B+树实现的,而MongoDB则是采取的B树,B树的结构也就决定了MongoDB在海量读写的情况下性能比mysql卓越(时间复杂度是O(1)-O(logN)), 而MySQL B+树的特性也决定了MySQL更适合多区间范围查询的业务需求。
? 当然,在具体的项目DB选择过程中,我们还需要考虑到成本、团队成员的意愿、技术栈等情况。总的来说,在当前的情况下,如果是海量数据高并发读写,从技术的角度推荐使用MongoDB,如果数据结构相对统一,同时对于事务有较高要求,个人倾向于MySQL。
标签:提升 链表 树结构 read myisam 读写 mmap 成本 http
原文地址:https://www.cnblogs.com/pankypan/p/11106052.html