MySQL存储引擎采用了可插拔的结构,即用户可以根据自己的需要来选择不同的存储引擎。
下表是MySQL不同的存储引擎的不同的特性:
Feature<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
MyISAM
BDB
Memory
InnoDB
Archive
NDB
Storage limits
256TB
No
Yes
64TB
No
384EB[4]
Transactions
No
Yes
No
Yes
No
Yes
Locking granularity
Table
Page
Table
Row
Row
Row
MVCC (snapshot read)
No
No
No
Yes
Yes
No
Geospatial support
Yes
Yes[1]
No
Yes[1]
Yes[1]
Yes[1]
B-tree indexes
Yes
Yes
Yes
Yes
No
Yes
Hash indexes
No
No
Yes
No
No
Yes
Full-text search indexes
Yes
No
No
No
No
No
Clustered indexes
No
Yes
No
Yes
No
No
Data caches
No
Yes
N/A
Yes
No
Yes
Index caches
Yes
Yes
N/A
Yes
No
Yes
Compressed data
Yes
No
No
No
Yes
No
Encrypted data[2]
Yes
Yes
Yes
Yes
Yes
Yes
Cluster database support
No
No
No
No
No
Yes
Replication support[3]
Yes
Yes
Yes
Yes
Yes
Yes
Foreign key support
No
No
No
Yes
No
No
Backup / point-in-time recovery[3]
Yes
Yes
Yes
Yes
Yes
Yes
Query cache support
Yes
Yes
Yes
Yes
Yes
Yes
Update statistics for data dictionary
Yes
Yes
Yes
Yes
Yes
Yes
下面列举几个常用的存储引擎:
l         MyISAM:MySQL默认的存储引擎,它主要用于大多数的Web、数据仓库和其它应用中。可以通过数据库配置文件中的storage_engine选项来改变默认的存储引擎。
l         InnoDB:主要用于事务处理应用,并且支持事务的ACID特性和外键。
l         BDB:支持COMMIT,ROLLBACK和其它事务特性。
在创建表或修改表的时候,都可以指定需要使用的存储引擎:
虽然InnoDB和BDB都支持事务,但是相比而已InnoDB支持得更好。
InnoDB通过多版本并发控制MVCC来支持事务的,允许COMMIT, ROLLBACK和svepoints。
而BDB支持事务,只是允许COMMIT和ROLLBACK。
由于我们主要研究MySQL的多版本并发控制机制,因此,后面主要是解析InnoDB存储引擎的代码。
InnoDB的设计是为了在处理大数据量的时候得到最好的性能。InnoDB存储引擎维护了一个它自己的缓冲区,用来存储数据和索引。InnoDB将表和索引存储在一个表空间中,这个表空间可能由不同的文件组成。而MyISAM存储引擎的表中每个表都存在一个独立的文件里面。
和达梦一样InnoDB的每个表都对应了一个相应的聚簇索引,如果表上有主键的话,则聚簇索引使用主键作为索引键,如果没有主键的话,则选择第一个非空列的非唯一索引作为聚簇索引,如果都没有的话,则使用rowid作为索引键。
事务模型:
InnoDB事务模型是将传统的两阶段封锁协议同多版本数据库特性相结合。它采用加行级锁和查询不加锁。
锁模型:
有两种类型的锁,共享锁和排它锁
l         共享锁S允许事务读一条记录
l         排它锁X允许事务更新或删除一条记录
如果事务T1拥有行t上的共享锁,那么:
l         如果其它事务T2请求t上的S锁,那么可以被立即授予。这样T1和T2都拥有t上的S锁。
l         如果其它事务T2请求t上的X锁,那么不能被授予。
如果事务T1拥有行t上的X锁,那么其它事务请求t上的任何锁都不能被授予。
另外,InnoDB支持多种上锁粒度,它允许同时加行锁和表锁。为了支持多粒度锁,引入了一个新的锁,意向锁。意向锁是加在表上的锁。意向锁就是表明某个事务之后要对这个表上的某个行加该类型的锁。
l         共享意向锁IS,表明事务T将要在表T的某些行上加S锁。
l         排他意向锁IX,表明事务T将要在表T的某些行上加X锁
意向锁协议是:
l         在某个事务请求行上的S锁之前,它必须先得到该行所在表的IS锁或更强的锁。
l         在某个事务请求行上的X锁之前,它必须先得到该行所在表的IX锁。
下面是锁的相容性矩阵:(相容为1,不相容为0)
X
IX
S
IS
X
0   
0
0
0
IX
0
1
0
1
S
0
0
1
1
IS
0
1
1
1
一个锁可以被授予被某个事务,如果事务请求的锁和已经上的锁相容。
隔离级别:
InnoDB默认隔离级别是REPEATABLE READ。InnoDB支持SQL标准的四个隔离级别。
一致性非上锁读:
InnoDB使用多版本的方式来控制一致性读,也就是说,给某个查询在该时刻的一个数据库的快照。这个查询可以看到这个时刻以前由其它事务提交的操作,而看不到之后做的改变或还未提交的改变。这个规则的唯一例外就是,事务可以看到本事务之前所做的还未提交的操作。这个规则导致了下面的异常:如果你更新了某个表里面的行,使用SELECT将可以看见最新更新的行和老版本的行。如果其它事务同时更新相同的表,那么你就可能看到根本不可能在数据库中存在的状态。
如果在某人的REPEATABLE READ隔离级别下的话,所有同一事物的所有一致性读都是读的第一次查询时建立的快照。如果想得到最新的快照的话,那么需要提交当前的事务,然后再开始新的查询。
注意:DROP TABLE 和ALTER TABLE语句不使用一致性读。因为DROP TABLE的话,MYSQL不能使用已经删除了的表。而ALTER TABLE的时候,MYSQL是将原来的表复制一份,然后删除掉原来的表。
Next-Key Locking:避免幻象
在行级锁中,InnoDB使用一种称为next-key locking的算法。当检索表的一个索引的时候,它对遇到的索引记录加S或X锁。因此行级锁实际上是索引记录锁。
InnoDB在索引记录上加锁的时候也影响了索引记录前的‘gap’。如果一个用户拥有索引上某个记录R的S或X锁,另一个用户不能马上在记录R前插入一个新的索引记录。这样就可以避免幻象的出现。
感觉就和达梦的范围锁的概念差不多
多版本的实现
为了实现多版本,InnoDB必须在表空间中保存行的旧版本信息。这些信息被保存在回滚段中。
在内部,InnoDB为每个行增加了两个域,一个6-byte的域来指示最后插入或更新这个行的事务标识符,删除标志也被认为是一个更新,因为它在提交前只是在行上做了一个标记。另外一个7-byte的域被称为回滚指针(roll pointer),回滚指针指向一个由回滚段写入的undo日志记录。如果一个行被更新了,undo日志记录包含了重建这行更新前信息的一些必要数据。
InnoDB使用回滚段的信息来执行事务回滚所必须的一些undo操作,而且也使用这些信息来重建更新前的行信息。
回滚段中的undo日志被分为插入日志和更新日志。插入日志仅在事务回滚的时候有用,事务提交之后就可以马上删除掉。更新日志在一致性读的时候需要使用,但是,如果当前没有事务再可能使用回滚段中的记录的时候,这些记录就可以删除掉了。因此,你必须经常提交你的事务,就算这些事务只是进行一致性读操作而已。否则,InnoDB不能删除掉某些更新日志,这样回滚段将变得越来越大。
回滚段中undo日志记录的物理大小要比其对应的插入或更新的行要小很多。

在多版本方式下,当你使用SQL语句删除某一行的时候,该行并不会马上从数据库的物理文件上移除。只有当InnoDB能够删除掉更新日志记录的时候,那些行及其对应的索引记录才会真正从物理上删除掉。这个移除操作称为purge。

转载于:https://blog.51cto.com/happytest/62845

MySQL存储引擎及InnoDB并发控制介绍相关推荐

  1. MySQL存储引擎(InnoDB引擎)

    本篇章主要介绍什么是 MySQL 存储引擎?常用的 MySQL 存储引擎有哪些?以及详细介绍一下目前应用最广泛的 InnoDB 存储引擎,包括其:逻辑存储结构.架构.事务原理.MVCC等. 一.初识  ...

  2. mysql存储引擎中INNODB和MyISAM的区别

    切记:存储引擎是基于表的,而不是数据库. 存储引擎概念: MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不 ...

  3. MySQL 存储引擎(InnoDB、MyISAM、MEMORY)

    一.MySQL的体系结构 1.连接层:最上层是一些客户端和链接服务,主要完成一些类似于连接处理.授权认证.及相关的安全方案.服务器也会为安全接入的每个客户端验证它所具有的操作权限. 2.服务层:第二成 ...

  4. 浅谈MySQL存储引擎选择 InnoDB还是MyISAM

    如果是一些小型的应用或项目,那么MyISAM 也许会更适合.当然,在大型的环境下使用MyISAM 也会有很大成功的时候,但却不总是这样的.如果你正在计划使用一个超大数据量的项目,那么你应该直接使用In ...

  5. Mysql 存储引擎中InnoDB与Myisam的主要区别

    一直以为我spring事物没有配置好,结果发现是mysql的表本身设置成了Myisam 引擎.改成innodb就支持事物了. 1, 事务处理 innodb 支持事务功能,myisam 不支持. Myi ...

  6. Mysql存储引擎中InnoDB与Myisam的区别

    为什么80%的码农都做不了架构师?>>>    1. 事务处理 innodb 支持事务功能,myisam 不支持. Myisam 的执行速度更快,性能更好. 2. select ,u ...

  7. MySQL存储引擎之InnoDB

    一.The InnoDB Engine Each InnoDB table is represented on disk by an .frm format file in the database ...

  8. MySQL存储引擎之Myisam和Innodb总结性梳理

    Mysql有两种常用的存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比   MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名 ...

  9. MySQL存储引擎InnoDB、MyISAM和MEMORY介绍详解和区别

    文章目录 MySQL存储引擎InnoDB.MyISAM和MEMORY介绍详解和区别 InnoDB存储引擎 特点 操作示例 创建InnoDB表 修改表引擎为InnoDB MyISAM存储引擎 特点 操作 ...

最新文章

  1. scipy.spatial.distance 与 sklearn cosine_similarity
  2. python字典相同key的值怎么分别取出_python字典值排序并取出前n个key值的方法
  3. pymysql的安装
  4. 《Java程序性能优化》之设计优化
  5. ms sql server 添加列,删除列。
  6. C++ —— C++类
  7. Bootstrap 文档类型
  8. ssis中数据类型_SSIS中的数据挖掘查询
  9. 全新 ENVI Modeler 遥感建模工具
  10. mysql date_format格式_mysql date_format 按不同时间单位进行分组统计
  11. 矩阵快速幂 求解斐波那契数列的快速算法
  12. 基于Multisim_UA741的四种波形发生器电路仿真
  13. EVO Evaluation of SLAM 5 --- ORB-SLAM3 精度和性能效果评估
  14. 瞬变抑制二极管TVS原理简介
  15. poscms多语言网站方案
  16. 改写二分搜索算法C++
  17. 海岸TDM系统配置工具-流程
  18. matlab中如何将Galois field array 转换 bin
  19. Linux安装arm交叉编译器
  20. 【专家访谈】测试专家 陈林钧 访谈问题收集中

热门文章

  1. 修改java bean,java – 以编程方式修改Spring bean
  2. mysql外键约束脚本_使用SQL脚本创建数据库,操作主键、外键与各种约束(MS SQL Server)...
  3. mysql 版本太高_mysql创建新库以及解决版本过高8.0以上导致navicat无法连接的问题...
  4. linux离线安装httpd服务,Linux系列之离线安装Apache HTTP
  5. oracle 索引 序列,【Oracle】表、视图、序列、索引
  6. Werkzeug routing
  7. Python Logging Handler
  8. 4.4 Triplet 损失
  9. Pandas Index 属性
  10. html获取元素坐标,js 获取元素相对于页面的坐标(示例)