首页 > 技术文章 > MySQL体系结构——存储引擎

plutozzl 2020-09-14 15:57 原文

image-20200912153703752

MySQL的组成部分:

  • 连接池组件
  • 管理服务和工具组件
  • SQL接口组件
  • 查询分析器组件
  • 优化器组件
  • 缓冲组件(cache)
  • 插件式存储引擎(相比其他数据库比较大的区别)
  • 物理文件

存储引擎是底层物理结构的实现,每个存储引擎的开发者可以按照自己的意愿来开发

存储引擎是基于表的,而不是数据库。

MySQL的存储引擎

MySQL数据库独特的插件式存储引擎结构,每个存储引擎都有自己的特点,能够根据不同的应用建立不同存储引擎的表。MySQL开源特性使得用户可以根据自己MySQL预定义的存储引擎接口来编写自己的存储引擎。如果对于某一功能不满意可以修改源码来得到我们想要的特性。

image-20200912160736279

1) Innodb存储引擎

Innodb存储引擎支持事务,其设计的目标主要面向在线事务处理(OLTP)的应用。特点是行锁设计,支持外键,并支持非锁定读,从MySQL5.5.8开始,InnoDB引擎成为MySQL的默认存储引擎。

InnoDB存储引擎将数据存储在一个逻辑的表空间中,这个表空间像黑盒一样由Innodb本身进行管理,从MySQL4.1版本开始,将InnoDB存储引擎的表存放到一个独立的ibd文件中,InnoDB引擎支持raw block来建立表空间。

InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认RR

mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.00 sec)

同时使用next-key locking 的策略避免幻读的现象。

除此之外,InnoDB还提供了插入缓存(insert buffer),二次写(double write),自适应哈希索引(adaptive hash index),预读(read head)等高性能和高可用功能。

表中数据的存储,InnoDB采用了聚集(clustered)的方式,因此每张表都按照主键的顺序进行存放。如果没有显示的在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。

2) MyISAM存储引擎

MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据库应用。在MySQL5.5.8版本之前MyISAM是默认的存储引擎。MyISAM存储引擎与其他引擎比较不同的 地方是它的缓冲池只缓存索引文件,而不缓存数据文件。

MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。可以使用myisampack来对数据文件进行压缩和解压。但是经过压缩的表是只读的。

MySQL5.0以前MyISAM支持单表大小为4G,更大需要指定隐藏属性规则。MySQL5.0以后默认支持256TB单表数据。

3) NDB存储引擎

NDB存储引擎是一个集群存储引擎,类似于Oracle RAc,不过与Oracle RAC share everything 不同的是,这个引擎的结构是share nothing,因此可以提供更高的可用性。NDB的特点是全部存放在内存中(从MySQL5.1开始可以将非索引数据放在磁盘上)因此这个引擎的主键查找速度极快。并且通过添加NDB数据节点(Data Node)可以线性的提高数据库的性能,是最高可用、高性能的集群系统。注意,NDB存储引擎的join操作是在MySQL的数据库层完成的而不是存储引擎层完成的。这也意味着复杂的连续操作需要巨大的网络开销,因此查询速度很慢。

4) Memory存储引擎

Memory存储引擎,以前被称为HEAP存储引擎,将表中的数据存放在内存中,如果数据库发生重启或者崩溃,表中的数据将会消失,它非常适用于存放临时表,以及数据仓库中的纬度表。Memory存储引擎默认使用hash索引,而不是B+tree。

Memory存储引擎速度非常快,但是使用上有很大的限制。只支持表锁,并发性能比较差,不支持Text,BLOB数据类型。还有一个问题,当MySQL使用Memory存储引擎作为临时表来存放查询的中间结果集。如果中间结果集大于Memory存储引擎表的容量或者这个结果集中间存在Text,BLOB字段,MySQL会将其转换成MyISAM存储引擎表来存放到磁盘上,MyISAM存储引擎并不会缓存数据文件,因此这时产生的临时表的性能对查询而言并不好。

5)Archive存储引擎

Archive存储引擎只支持INSERT和SELECT操作,从MySQL5.1开始支持索引。Archive存储引擎使用Zlib算法将数据行(row)进行压缩后存储,压缩比一般可达1:10。Archive存储引擎非常适合存储归档数据,比如日志信息。使用行锁来实现高并发的插入操作,但本身并不是事务安全的存储引擎,其设计的主要目的是提高高速插入和压缩功能。

6)Federated存储引擎

Federated存储引擎表并不存放数据,它只是指向一台远程的MySQL服务器上的表,这非常类似于SQL server上的链接服务器和Oracle中的透明网关,不同的是这个引擎只支持MySQL数据表,而不支持其他异构数据库表。

7)Maria存储引擎

Maria存储引擎是新开发的存储引擎,目标是取代原本的MyISAM引擎,设计者也是MySQL的创始人之一。可以看作是MyISAM的后续升级版本,这个引擎在MyISAM上做出了很多的优化,它的特点是支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,支持事务和非事务的安全选项,以及更好的BLOB字符类型的处理性能。

8)其他存储引擎

MySQL还有很多存储引擎,如Merge,CSV,Sphinx和InfoBright。不同的引擎都有各自适合的场景。

问题:

[] 哪些MySQL存储引擎支持全文索引?

MyISAM,InnoDB,Sphinx存储引擎都支持全文索引

[]MySQL数据库快是否是因为它不支持事务?

不是的,虽然MySQL的MyISAM不支持事务,但是InnoDB是支持的。而快这个概念也应该是针对不同的场景而言的,对于ETL这种操作当然是MyISAM更有优势,但在OLAP环境中,InnoDB引擎的效率会更好。

[]数据量超过1000万,MySQL的性能会急剧下降?数据库随着数据行数的增加性能都会有所下降,但不是线性的,选择正确的引擎和正确的配置再多的数据量MySQL也是可以承受的。

各存储引擎之间的比较:

image-20200913173517895

与引擎相关的查询:

查询当前数据库支持哪些引擎:

mysql> show engines\G
*************************** 1. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 2. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 4. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 7. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
9 rows in set (0.00 sec)


来自为知笔记(Wiz)


推荐阅读