**
**
最上层(连接/线程处理):是基于网络的客户端/服务器的工具或者服务都具有类似架构。主要负责连接处理,权限控制和安全等。
中间层(解析,查询缓存,优化):MySQL的核心服务。主要包括:查询解析、分析、优化、缓存以及所有的内置函数(例如:日期、时间、数学和加密函数,所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
最底层(存储引擎):负责mysql中数据的存储和提取。服务器通过API和存储引擎进行通信。存储引擎不会去解析SQL(InnoDB除外,会解析外键的定义),不同存储引擎之间不会相互通信,只是简单响应上层服务器的请求。
主要解决对数据库读写的并发操作。通常加锁:共享锁(读锁)和排它锁(写锁)。通过不同的锁策略(在锁的开销和数据的安全性之间寻求平衡)来提高数据库的并发读写。通常有表锁和行锁。
表锁和行锁的区别
表锁 | 行锁 |
---|---|
开销小 | 开销大 |
不会出现死锁 | 会出现死锁 |
发生冲突的概率高,并发低 | 发生冲突的概率低,并发高 |
这里只列出四种隔离级别,不在进行具体赘述,想了解详细概念及之间区别的读者请查阅相关文档。
读未提交(Read Uncommitted)
读已提交(Read Committed)
可重复读(Repeatable Read) mysql默认的隔离级别
序列化(Serializable)
四种隔离级别可能出现的问题:
多版本并发控制(MVCC):主要解决的数据库并发读写问题。这里主要介绍mysql的多版本并发控制的相关知识。 MVCC的实现主要是通过保存数据在某个时间点的快照进行实现。 在InnoDB中,MVCC是通过在每行记录后面保存两个隐藏的列进行实现。一个列是保存行的创建时间(行版本号),另外一个是保存行的过期时间(或删除时间)。 在mysql中,MVCC主要是在Read Committed和Repeatable Read两个隔离级别中进行工作。其他两个隔离级别不兼容。因为在Read Uncommitted中总是读取最新数据,而不是符合事务版本的数据行,而Serializable则是对所有读取的行进行加锁。
在Repeatable Read隔离级别下,MVCC具体操作如下:
①InnoDB查找版本早于当前事务版本的数据行(行的版本号≤事务版本号),确保事务需要读取的行在事务开始之前或者由于事务自身插入(修改)导致的。 ②行的删除版本号要么未定义,要么大于当前事务的版本号。确保事务读取的行在事务开始之前未被删除。
InnoDB为新插入的行保存当前系统版本号作为行版本号。
InnoDB为删除的行保存当前系统版本号作为删除标识。
InnoDB插入一行新纪录,保存当前系统版本号作为行版本号,同时将系统版本号作为删除行的标识。
主要是InnoDB和MyISAM
InnoDB采用MVCC支持高并发,采用Repeatable Read的隔离级别,通过间隙锁解决幻读问题。间隙锁:不仅仅锁定查询涉及的行,同时还会对索引中的间隙进行锁定,防止幻影行插入。
这里只做粗略的介绍,至于这两个索引之间的区别和联系,读者可以自行在网上进行查阅相关文献。
以上内容只是个人理解。如有理解不当的地方还请指出,大家共同努力进步。谢谢!