# 8. 引擎是干什么的

![](https://3064259429-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC_ucxnzAClkrgsGdFP%2Fsync%2F476eee4cee9c7142d93849d952817b9248f1b395.png?generation=1597894669274552\&alt=media)

MySQL默认用的是InnoDB引擎, 看看上面的图, 真正MySQL本体(Server层)负责的只有查询缓存, 语句解析与优化, 换句话说, MySQL-Server只是负责提炼语句, 然后把语句送进引擎层, 具体怎么一种执行策略就全归引擎层负责了, 因此:

* Server层负责:
  * 语法解析: 常见的SyntaxError就是在Server层的解析器抛出来的
  * 连接管理: 比如一个连接的有效时长是多久多久
  * 查询缓存命中: 不走存储引擎直接返回
* 存储引擎层负责: 所有的执行策略, feature 等等都是引擎负责的, 可以说从一个string开始到最后的结果集, 所有的东西都是存储引擎负责
  * 怎样避免死锁: 死锁检测功能
  * 怎样让你的语句查询的更快: 索引的设计与实现, B+树
  * 怎样在并发的条件下避免脏读脏写: 各种锁MVCC的实现
  * 怎样做到即使Crash了也能让事务稳健: Crash-Safe的binlog/redo-log, 其中redo-log是InnoDB特有的实现方案, ISAM是没有的
