先看一条SQL如何入库的:
这是一条很简单的更新SQL,从MySQL服务端接收到SQL到落盘,先后经过了MySQL Server层和InnoDB存储引擎。
- Server层就像一个产品经理,分析客户的需求,并给出实现需求的方案。
- InnoDB就像一个基层程序员,实现产品经理给出的具体方案。
在MySQL”分析需求,实现方案“的过程中,还夹杂着内存操作和磁盘操作,以及记录各种日志。
他们到底有什么用处?他们之间到底怎么配合的?MySQL又为什么要分层呢?InnoDB里面的那一块Buffer Pool又是什么?
我们慢慢分析。
分层结构
MySQL为什么要分为Server层和存储引擎两层呢?
这个问题官方也没有给出明确的答案,但是也不难猜,简单来说就是为了“解耦”。
Server层和存储引擎各司其职,分工明确,用户可以根据不同的需求去使用合适的存储引擎,多好的设计,对不对?
后来的发展也验证了“分层设计”的优越性:
MySQL最初搭载的存储引擎是自研的只支持简单查询的MyISAM的前身ISAM,后来与Sleepycat合作研发了Berkeley DB引擎,支持了事务。
江山代有才人出,技术后浪推前浪,MySQL在持续的升级着自己的存储引擎的过程中,遇到了横空出世的InnoDB,InnoDB的功能强大让MySQL倍感压力。
自己的存储引擎打不过InnoDB怎么办?
打不过就加入!
MySQL选择了和InnoDB合作。正是因为MySQL存储引擎的插件化设计,两个公司合作的非常顺利,MySQL也在合作后不久就发布了正式支持nnoDB的4.0版本以及经典的4.1版本。
MySQL兼并天下模式也成为MySQL走向繁荣的一个重要因素。这能让MySQL长久地保持着极强竞争力。
时至今日,MySQL依然占据着极高数据库市场份额,仅次于王牌数据库Oracle。
Buffer Pool
在InnoDB里,有一块非常重要的结构——Buffer Pool。
Buffer Pool是个什么东西呢?
Buffer Pool就是一块用于缓存MySQL磁盘数据的内存空间。
为什么要缓存MySQL磁盘数据呢?
我们通过一个例子说明,我们先假设没有Buffer Pool,user表里面只有一条记录,记录的age = 1,假设需要执行三条SQL:
- 事务A:update user set age = 2
- 事务B:update user set age = 3
- 事务C:update user set age = 4
如果没有Buffer Pool,那执行就是这样的: