前言

该篇文章主要内容如下图所示:
image.png

Mysql数据库结构体系

如图所示
mysql-server-struct

分析器

对sql语句做词法分析以及语法分析,比如是select、update或者是insert,然后在到具体操作的表和字段,判断表是否存在、字段是否存在、语法是否正确。

优化器

对sql语句做优化,决定是使用哪个所以,决定join的顺序

执行器

执行sql语句时判断对当前表是否有操作的权限,如果没有就会返回权限错误,如果有就打开表进行执行。

存储引擎

mysql的存储引擎有很多,但是比较常见的有Innodb、Myisam、Memory,但是除此之外还有NDB、Archive、Maria、Federated

Innodb

主要面向OLTP(在线事务处理)的应用,通过多版本并发控制(MVVC)实现高并发性,支持事务(默认的事务隔离级别为repeatTable)、行锁。通过next-key-locking的策略避免幻读的产生。通过二次写、插入缓冲、自适应哈希索引、预读提高性能和可用性。

Myisam

Myisam由MYD和MYI组成,不支持事务、不支持行锁、支持表锁、支持全文索引主要面向OLAP(在线分析处理)的应用。Myisam只缓存索引文件,不缓存数据文件。

Memory

将表中的数据存放在内存中,如果服务器宕机或者重启数据将会丢失,不适合做数据的持久化存储,更适合用作临时数据存储,默认使用哈希索引,支持B树索引。虽然存储引擎很快,但是使用中依然存在限制。

  • 只支持表锁,并发性差
  • 不支持TEXT和BLOB的数据类型
  • 存储变长字段时是按照定长字段的方式存储所以会有空间浪费的问题

NDB

集群索引引擎,数据全部存放在内存中,因此通过主键查找的速度很快并且能通过增加集群中的节点提升性能,但是NDB在Join的操作上是在mysql数据层面上处理,所以越复杂的连接操作会有比较大的网络开销

Archive

Archive只支持select和insert,mysql版本在5.1之后支持索引,使用场景上一般为存储归档的数据,因为其会将行数据通过zlib算法进行压缩,因此数据占用的空间会比较少,但该引擎非事务安全的存储引擎,仅提供快速插入和压缩的功能

Maria

是为了取代Myisam而开发的存储引擎,支持缓存数据和索引文件,支持行锁,支持MVVC,支持事务和非安全事务的选择,以及更好的BLOB字符类型的处理性能

对比表格

各存储引擎对比如下,如果有问题请指出。

功能 Myisam Memory InnoDB Archive NDB
支持事务 N N Y N N
锁类型 表锁 表锁 行锁 行锁 行锁
MVVC N N Y Y Y
B树索引 Y Y Y N Y
Hash索引 N Y Y N Y
全文索引 Y N N N N
聚簇索引 N N Y N N
数据缓存 N Y Y N Y
索引缓存 Y Y Y N Y
数据压缩 Y N N Y N
存储成本(应该是硬盘空间) N/A 非常低
内存成本 中等
批量插入速度 非常高