详解InnoDB——综述

从 mysql-5.5 开始innodb作为默认的存储引擎了 ,是最重要使用最广泛的存储引擎,它被设计用来处理大量的短期事务,短期事务大部分是正常提交的,也会被回滚,InnoDB的性能和自动崩溃恢复特性(基于redo log实现的crash-safe),使得在非事务型存储的需求中也非常流行
在这里插入图片描述
mysql分为客户端、Server层、存储引擎,存储引擎除非非常特殊的原因,否则优先考虑InnoDB

概述

InnoDB采用MVCC来支持高并发,并且实现了4个标准的蛤蜊级别,默认级别是REPEATABLE READ(可重复读),并且使用间隙锁(next-key locking)策略放置幻读的出现,使InnoDB不仅仅锁定查询的行,还会对索引中的间隙进行锁定,以防止幻影行的插入

InnoDB是基于聚簇索引建立的,聚簇索引对主键查询有很大作用,二级索引中包含的列(InnoDB采用B+Tree,树的叶子节点就是主键索引,这也是二级索引需要回表的原因),这也就导致了如果主键索引比较大,其他所有索引都会很大,所以表中索引较多时,主键应该尽可能的小

MylSAM存储引擎

MySQL5.1及以前的版本MylSAM是默认的存储引擎,MylSAM提供了包括全文索引、压缩、空间函数等特性,最大的缺陷就是不支持事务和行级锁,

另一个缺陷就是由于没有redo log,所以MylSAM没有InnoDB支持的快速恢复功能

MylSAM也有自己的优势,对于只读的数据,或者表比较小,可以使用MylSAM

存储
MylSAM将表存储在两个文件,数据文件和索引文件

特性

加锁与并发
MylSAM对整张表加锁,而不是行锁,读取时会将涉及到的所有表加共享锁,写时加排它锁,但是有读取的同时可以并发插入

修复
MylSAM检查表的错误,可以手动或者自动的修复

索引
支持全文索引

MylSAM和InnoDB的区别

  1. MylSAM提供了包括全文索引、压缩、空间函数等特性,最大的缺陷就是不支持事务和行级锁,而InnoDB支持事务和行级锁
  2. InnoDB支持事务、备份、崩溃恢复
  3. MyISAM适合查询以及插入为主的应用。
  4. InnoDB支持外键,MyISAM不支持
  5. InnoDB中不保存表的行数,如select count() from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时MyISAM也需要扫描整个表
  6. InnoDB是聚簇索引(叶子节点存数据),MyISAM是非聚簇索引(叶子节点存指针)

特性

(1)插入缓冲
对于非聚集类索引的插入和更新操作,不是每一次都直接插入到索引页中,而是先插入到内存中。就相当于加了一层“redis”。
具体做法是:如果该索引页在缓冲池中,直接插入;否则,先将其放入“插入缓冲区”中,然后再以一定的频率和索引页合并。这时,就可以将同一个索引页中的多个插入合并到一个IO操作中,大大提高写性能。

(2)两次写
在应用重做日志前,会先建立一个页的副本,当写入失效发生时,先通过页的副来还原该页,再进行重做。
(3)自适应哈希索引
哈希是一种非常快的查找方法,一般仅需要一次查找就能定位数据,而B+树需要3~4次。InnoDB会监控对表中数据的查询,如果觉得换为哈希索引能提升速度,就会自动建立哈希索引。

(4)异步IO
用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部发送完毕后,再等待所有IO操作的完成。同时,也可以将多个IO合并为一个IO。

(5)刷新邻接页
当刷新一个脏页时,InnoDB会检测该页所在区的所有页,如果是脏页,会一起刷新。这样能减少IO次数。

猜你喜欢

转载自blog.csdn.net/yujing1314/article/details/107222534