Innodb和Myisam存储引擎的区别
Innodb支持事务,Myisam不支持,对于innodb每一条sql语言都默认封装成事务,自动提交这样会影响速度,所以最好把多条sql语言放在begin和commit之间组成一个事务。
innodb支持外键,myisam不支持
innodb是聚集索引,使用B+树作为索引结构,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。myisam是非聚集索引,使用B+树作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针也就是说innodb的b+树索引的叶子节点保存的是数据文件,而myisamb+树索引叶子节点保存的是文件的地址指针。
innodb没有保存表的具体行数,而mysam保存了整个表的具体行数
innodb不支持全文索引,而myisam支持全文索引,在设计全文索引领域myisam的查询速度更快5.7之后的innodb支持
innodb支持表,行级锁,myisam支持表级锁
innodb必须有唯一索引如主键
innodb的存储文件有frm ibd myisam是frm myd myi
为什么mysiam和innodb都使用b+树作为索引的基本数据结构,它有什么优点。
b+树是由二叉查找树,平衡二叉树,b树这三种数据结构演化而来。它的目的是减少对硬盘的访问,但是能取出更多的数据,提高效率
二叉查找树的特点是节点左边的值都会比节点的值小,按照这样的规则插入和查询数据能减少查询的次数。
但是如果二叉查找树排列成了一个链表,那么它的优势将不存在。于是为了避免这种情况便有了平衡二叉树,它要求每个节点的左右子树的高度差不能超过1.
但是一般的表中的数据都是存放在硬盘中的,读取它的速度比读取内存中的速度慢得太多了。因此我们需要减少从硬盘中读取数据的次数。另外从磁盘中读取数据是一块一块的读,而不是一条一条的读如果我们能够把更多的数据存放入磁盘中,那一次磁盘读取操作就能读出更多的数据。
如果我们要存储海量的数据这样二叉树的高度就会非常高,我们读取数据时因为是一次读取一个数据所以就会访问硬盘多次。我们的查询效率将会变得特别低。因此为了提高查询效率,我们需要向数据块中存放更多的信息。
因此b树(balance)树便诞生了
b树的每一个节点称为页,每一个页就是我们读取的磁盘块,在mysql中数据读取的基本单位都是页,b树相对于平衡二叉树,每个页存储了更多的键值和数据,并且每个节点都拥有更多的子节点。基于这个特性,b树查找数据读取磁盘的次数将会减少,
b+树是B树的进一步优化,b+树的非叶子节点是不存储数据的,仅存储键值,因为页的大小在数据库中是固定的,innodb中页的默认大小是16kb。能存储更多的键值。相应树的阶数就会更大,整个树就会更矮更胖,如此我们对硬盘的访问次数将会更少,数据查询的效率也会更高,另外b+树的阶数是等于键值的数量的,如果b+树一个节点能存储1000个键值那么3层b+树就能存储100010001000=10亿个数据,只需要2次磁盘io
b+树索引的所有数据均存储在叶子节点,而且是按照顺序排列的,那么b+树使得范围查诈,排序查找,分组查诈骗以及去重查找变得更简单,b树的数据分布在各个节点
b+树叶子节点通过链表连接
聚簇索引和非聚簇索引:
是根据是否由主键创建的索引来区分
myisam叶子节点中存储的是数据的文件地址
四种隔离级别:
未提交读:出现脏读现象
可提交读:能够解决脏读,修改数据时会加锁,可出现幻读
可重复读:能够解决幻读现象
可串行读:事务需要按串行化解决MVCC
MVCC多版本控制并发技术可以实现数据库中并发访问。读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能,现阶段几乎所有的RDBMS,都支持了MVCC。
读操作和分为这两类:快照读,当前读
读取的是记录的可见版本,有可能是历史版本,不用加锁,不会阻碍其他事务的写
当前读:读取的最新版本,并且当前读返回的记录,会上锁,保证其他事务不会再并发修改这条记录。