mysql数据库中的存储引擎

mysql数据库中的存储引擎

mysql中包含的存储引擎

#我们可以在创建上述索引的时候,为其指定索引类型,分两类
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)

#不同的存储引擎支持的索引类型也不一样
InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;

1.InnoDB存储引擎

1.1简介

从Mysql5.5版本开始,InnoDB是默认的表存储引擎。其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读、同时被设计用来最有效的利用以及使用内存和CPU。

补充知识MVCC:全称Multi-Version Concurrency Control,即多版本并发控制,主要是为了提高数据库的并发性能。以下文章都是围绕InnoDB引擎来讲,因为myIsam不支持事务。
同一行数据平时发生读写请求时,会上锁阻塞住。但mvcc用更好的方式去处理读—写请求,做到在发生读—写请求冲突时不用加锁。
这个读是指的快照读,而不是当前读,当前读是一种加锁操作,是悲观锁。

1.2InnoDB体系架构

InnoDB存储引擎有多个内存块,这些内存块组成了一个大的内存池,后台线程主要功能是刷新内存池中的数据,将已经修改的数据刷新到磁盘。

1.2.1后台线程

InnoDB后台有多个不同功能的线程:

Master线程:该线程是最核心的线程,主要功能是将缓存池中的数据异步刷新到磁盘,保证数据 的一致性,包括脏页的刷新,合并插入缓冲,UNDO页的回收。

补充知识:
脏页:当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。
内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。
平时很快的更新操作,都是在写内存和日志,他并不会马上同步到磁盘数据,这时内存数据页跟磁盘数据页内容不一致,我们称之为“脏页”。
一条 SQL 语句,正常执行的时候特别快,偶尔很慢。那这时候可能就是在将脏页同步到磁盘中了

 MySQL中的日志文件,有这么两类常常讨论到:undo日志与redo日志。
 
UNDO:Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC)。
undo log主要记录的是数据的逻辑变化,为了在发生错误时回滚之前的操作,需要将之前的操作都记录下来,然后在发生错误时才可以回滚。
 
 Redo log的主要作用是用于数据库的崩溃恢复
 Redo log可以简单分为以下两个部分:
一是内存中重做日志缓冲 (redo log buffer),是易失的,在内存中
二是重做日志文件 (redo log file),是持久的,保存在磁盘中
 

IO线程:在 InnoDB 存储引擎中大量使用了异步 IO 来处理写 IO 请求, IO Thread 的工作主要是负责这些 IO 请求的回调处理。

Purge线程:事务被提交之后,undo log可能不再需要,此时就可以通过该线程会后已经使用并分配的undo页,InnoDB是支持多个Purge线程,这样可以提高回收效率。

Page Cleaner线程:在InnoDB 1.2.x版本新引入的,其作用是将之前版本中脏页的刷新操作都放入单独的线程中来完成,这样减轻了 Master Thread 的工作及对于用户查询线程的阻塞。

1.2.2内存

InnoDB 存储引擎是基于磁盘存储的,也就是说数据都是存储在磁盘上的,由于 CPU 速度和磁盘速度之间的鸿沟, InnoDB 引擎使用缓冲池技术来提高数据库的整体性能。

对数据库进行读取页操作的大概流程:
1.将从磁盘读到的页数据存放到缓冲池中

2.下一次读取到该页数据时,首先判断这个数据是不是已经在缓冲池中,在的话,直接从缓冲池中拿取,不在,就从磁盘中读取

对数据库中页数据的修改操作大概流程:

1.先在缓冲池中对该页进行修改

2.按照设置的频率刷新到磁盘

缓冲池:一片连续的内存空间。

缓冲池中的页数据类型有:索引页,数据页,undo页,插入缓冲,自适应哈希索引,Innodb的锁信息,数据字典信息等。

1.2.3InnoDB内存数据对象

为了更好的管理缓冲池中的页数据,InnoDB给每个换种池中的页都加上了各自对应的控制信息,这些控制信息中包括页所属的表空间编号,页号,页的内存地址,锁的信息等。

注意所有的控制信息放在一起,页放在一起,一个控制信息对应一个页,都存放在缓冲池中

在这里插入图片描述

怎么区分Buffer Pool中哪些缓存页是空闲的,哪些已经被使用了呢?我们最好在某个地方记录一下哪些页是可用的,我们可以把所有空闲的页包装成一个节点组成一个链表,这个链表也可以被称作Free链表(或者说空闲链表)。因为刚刚完成初始化的Buffer Pool中所有的缓存页都是空闲的,所以每一个缓存页都会被加入到Free链表中,假设该Buffer Pool中可容纳的缓存页数量为n,那增加了Free链表的效果图就是这样的:

在这里插入图片描述

就暂时挖掘到这里,后边更深的东西,我目前的水平跟不上了,基本看不懂。

就InnoDB存储引擎,我大概的理解就是通过对不同功能的线程运作来完成对数据库中页数据的拿取和修改操作,该操作借助于内存中的缓冲池临时存放页数据,使用页数据和控制数据的对应方案以及使用链表节点记录页对应控制数据的内存地址,主要用来标识某缓存页是否被使用了。实现了对大量数据进行事务操作时,效率相对较高的效果。mysql默认的存储引擎就是innoDB。

1.3InnoDB存储引擎模式在表存储中具体文件构成

表的存储上,它是将一张表划分为2个文件:XXX.frm (表的表结构文件) XXX.ibd (数据和索引文件)

2.MyISAM存储引擎

2.1简介

MyISAM 存储引擎是 MySQL 中常见的存储引擎,曾(MySQL 5.1及之前版本)是 MySQL 的默认存储引擎。

MyISAM 是基于 ISAM 存储引擎发展起来的。实际上那会还没有存储引擎的概念,ISAM 只是一种算法,或者说是数据的处理方式。如同 SQL Server/Oracle 这类产品一样,MySQL 对表对象的管理方式只有一种。随着 MySQL 架构的不断发展和演进,最终才引入插件式存储引擎的概念,ISAM 也进化为 MyISAM 并一直作为 MySQL 数据库的默认存储引擎,直到 MySQL 5.5 版本才被 InnoDB 引擎取代了默认存储引擎的地位。

2.2MyISAM的优缺点

优点
  • 占用空间小
  • 访问速度快,对事务完整性没有要求或以 SELECT、INSERT 为主的应用基本上都可以使用这个引擎来创建表
  • 可以配合锁,实现操作系统下的复制备份
  • 支持全文检索(InnoDB 在 MySQL 5.6 版本以后也支持全文检索)
  • 数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能。
缺点
  • 不支持事务的完整性和并发性
  • 不支持行级锁,使用表级锁,并发性差
  • 主机宕机后,MyISAM表易损坏,灾难恢复性不佳
  • 数据库崩溃后无法安全恢复
  • 只缓存索引,数据的缓存是利用操作系统缓冲区来实现的,可能会引发过多的系统调用,且效率不佳

2.3MyISAM存储引擎模式在表存储中具体文件构成

表的存储上,它是将一张表划分为3个文件:XXX.frm (表的表结构文件) XXX.MYD (数据文件) XXX.MYI (索引文件)

3.Memory存储引擎 (了解)

3.1简介

memory存储引擎是MySQL中的一类特殊的存储引擎。其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。这些特性都与InnoDB,MyISAM存储引擎不同。

3.2memory存储引擎的文件存储形式,索引类型,存储周期和优缺点。

每个基于memory存储引擎的表实际对应一个磁盘文件,该文件的文件名与表名相同,类型为frm类型。该文件只存储表的结构,而其数据文件,都是存储在内存中的,这样有利于对数据的快速的处理,提高整个表的处理效率。

值得注意的是:服务器需要有足够的内存来维持memory存储引擎的表的使用。如果不需要了,可以释放这些内存,甚至可以删除不需要的表。

Memory存储引擎默认使用哈希(HASH)索引,其速度比使用B型树(BTREE)索引快。如果我们需要使用B型树索引,可以在创建索引时选择使用。

3.3Memory小的技巧

Memory存储引擎通常很少用到。因为Memory表的所有数据都是存储在内存上的,如果内存出现异常会影响到数据的完整性。

如果重启机器或者关机,表中的所有数据都将消失,因此,基于Memory存储引擎的表的生命周期都比较短,一般都是一次性的。

Memory表的大小是受到限制的,表的大小主要取决于2个参数,分别是max_rows和max_heap_table_size。其中,max_rows可以在创建表时指定,max_heap_table_size的大小默认为16MB,可以按需要进行扩大。

因此,其基于内存中的特性,这类表的处理速度会非常快,但是,其数据易丢失,生命周期短。基于其这个缺陷,选择Memory存储引擎时需要特别小心。

4.NDB存储引擎(了解)

MySQL Cluster 是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器。在MyQL 5.0及以上的二进制版本中、以及与最新的Linux版本兼容的RPM中提供了该存储引擎。(注意,要想获得MySQL Cluster 的功能,必须安装 mysql-server 和 mysql-cluster RPM)。

目前能够运行MySQL Cluster 的操作系统有Linux、Mac OS X和Solaris(一些用户通报成功地在FreeBSD上运行了MySQL Cluster ,但MySQL AB公司尚未正式支持该特性)。

MySQL Cluster 是一种分布式设计,目标是要达到没有任何单点故障点。因此,任何组成部分都应该拥有自己的内存和磁盘。该技术允许在无共享的系统中部署“内存中”数据库的 Cluster ,任何共享存储方案如网络共享,网络文件系统和SAN设备是不推荐或不支持的。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。通过这种冗余设计,MySQL声称数据的可用度可以达到99.999%。

NDB是一种“内存中”的存储引擎,它具有可用性高和数据一致性好的特点。

MySQL Cluster 能够使用多种故障切换和负载平衡选项配置NDB存储引擎。MySQL Cluster的NDB存储引擎包含完整的数据集,仅取决于 Cluster本身内的其他数据。

目前,MySQL Cluster的 Cluster部分可独立于MySQL服务器进行配置。在MySQL Cluster中, Cluster的每个部分被视为1个节点。

管理(MGM)节点:这类节点的作用是管理MySQL Cluster内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM节点是用命令“ndb_mgmd”启动的
数据节点:这类节点用于保存 Cluster的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。不过没有必要设置多个副本。数据节点是用命令“ndbd”启动的。
SQL节点:这是用来访问 Cluster数据的节点。对于MySQL Cluster,客户端节点是使用NDB Cluster存储引擎的传统MySQL服务器。通常,SQL节点是使用命令“mysqld –ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动。
注释:在很多情况下,术语“节点”用于指计算机,但在讨论MySQL Cluster时,它表示的是进程。在单台计算机上可以有任意数目的节点,为此,我们采用术语“ Cluster主机”。

管理服务器(MGM节点)负责管理 Cluster配置文件和 Cluster日志。 Cluster中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在位置的方式。当数据节点内出现新的事件时,节点将关于这类事件的信息传输到管理服务器,然后,将这类信息写入 Cluster日志。

此外,可以有任意数目的 Cluster客户端进程或应用程序。它们分为两种类型:

标准MySQL客户端:对于MySQL Cluster,它们与标准的(非 Cluster类)MySQL没有区别。换句话讲,能够从用PHP、Perl、C、C++、Java、Python、Ruby等编写的现有MySQL应用程序访问MySQL Cluster。
管理客户端:这类客户端与管理服务器相连,并提供了启动和停止节点、启动和停止消息跟踪(仅调试版本)、显示节点版本和状态、启动和停止备份等的命令。

5.Archive存储引擎(了解)

这个存储引擎基本上用于数据归档;它的压缩比非常的高,存储空间大概是innodb的10-15分之一所以它用来存储历史数据非常的适合,由于它不支持索引同时也不能缓存索引和数据,所以它不适合作为并发访问表的存储引擎。Archivec存储引擎使用行锁来实现高并发插入操作,但是它不支持事务,其设计目标只是提供高速的插入和压缩功能。

每个archive表在磁盘上存在两个文件

.frm(存储表定义)

.arz(存储数据)

1.archive存储引擎支持insert、replace和select操作,但是不支持update和delete。

2.archive存储引擎支持blob、text等大字段类型。支持auto_increment自增列同时自增列可以不是唯一索引。

3.archive支持auto_increment列,但是不支持往auto_increment列插入一个小于当前最大的值的值。

4.archive不支持索引所以无法在archive表上创建主键、唯一索引、和一般的索引。

存储

往archive表插入的数据会经过压缩,archive使用zlib进行数据压缩,archive支持optimize table、 check table操作。

一个insert语句仅仅往压缩缓存中插入数据,插入的数据在压缩缓存中被锁定,当select操作时会触发压缩缓存中的数据进行刷新。insert delay除外。

对于一个bulk insert操作只有当它完全执行完才能看到记录,除非在同一时刻还有其它的inserts操作,在这种情况下可以看到部分记录,select从不刷新bulk insert除非在它加载时存在一般的Insert操作。

检索

对于检索请求返回的行不会压缩,且不会进行数据缓存;一个select查询会执行完整的表扫描;当一个select查询发生时它查找当前表所有有效的行,select执行一致性读操作,注意,过多的select查询语句会导致压缩插入性能变的恶化,除非使用bulk insert或delay insert,可以使用OPTIMIZE TABLE 或REPAIR TABLE来获取更好的压缩,可以使用SHOW TABLES STATUS查看ARCHIVE表的记录行。

优势

由于高压缩和快速插入的特点Archive非常适合作为日志表的存储引擎,但是前提是不经常对该表进行查询操作。

以上就是我对mysql 中包含的几种存储引擎简单的做了一哈介绍,简单的的梳理了一些知识点,参考其他博主的文章比较多,理论性比较强,涉及内存的存储引擎我感觉平时应该是涉及不到的,所以我也写的很肤浅,希望这篇文章可以帮到你简单了解mysql中存储引擎,共勉。

参考:

一文了解InnoDB存储引擎 - 简书 (jianshu.com)

MySQL MyISAM存储引擎 (biancheng.net)

mysql脏页是什么 - 知乎 (zhihu.com)

MYSQL undo redo页介绍_toyijiu的专栏-CSDN博客_undo页

mysql中的undo页_《mysql》之undolog_腿毛拆床垫的博客-CSDN博客

MySQL 谈谈Memory存储引擎 - 云+社区 - 腾讯云 (tencent.com)

浅析MySQL事务中的redo与undo - 简书 (jianshu.com)

MySQL Cluster NDB(Mysql 集群) - 残夜 - 博客园 (cnblogs.com)

MySQL Archive存储引擎 - pursuer.chen - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值