文章大纲
一、前言
大家好,我是小诚,从上一篇《一条SQL执行的完整流程解析》介绍了MySQL的执行流程,我们知道了MySQL服务端又划分为:MySQL Server层和存储引擎层。本篇内容主要是介绍MySQL8.x支持的存储引擎及其特点,让大家进一步熟悉MySQL
最近时常会收到一些小伙伴反馈的问题,为了方便交流,所以创建了交流群,感兴趣的可以添加,欢迎大家一起交流,吹水,摸鱼,进步。
《从0到1-全面深刻理解MySQL系列》系列文章会持续更新,感兴趣的小伙伴可以关注我,一起加油,一起进步!,如有帮助,不要忘记一键三联哦,ღ( ´・ᴗ・` )比心!
二: MySQL支持的存储引擎
存储引擎主要负责的是对数据的存取进行相应的操作,通过MySQL官方文档可知MySQL8.0支持10种类型存储引擎,具体如下:
三: MySQL支持的存储引擎的特点
(一)、InnoDB:
是Mysql8.0中默认的存储引擎。InnoDB是 MySQL 的事务安全(符合 ACID)存储引擎,具有提交、回滚和崩溃恢复功能来保护用户数据。
InnoDB行级锁定(不升级为更粗粒度的锁定)和 Oracle 风格的一致非锁定读取提高了多用户并发性和性能。
InnoDB将用户数据存储在聚集索引中,以减少基于主键的常见查询的 I/O。为了维护数据完整性, InnoDB还支持FOREIGN KEY引用完整性约束。
(二) 、MyISAM
使用这种存储引擎的表占用的空间很小,表级别的锁(表锁)限制了它的读/写负载的性能,它通常用于 Web 和数据仓库配置中的只读或以读取为主的工作场景中。
(三) 、Memory
这种存储引擎将所有的数据都存储在内存中,以便在非关键数据的环境中需要快速查找场景中进行快速访问,这个存储引擎在之前也被称为HEAP引擎。
这种引擎的使用正在逐渐减少,因为在InnoDB引擎中通过缓冲池内存区提供了一种通用且持久的方式来将大部分或者所有数据保存在内存中,且NDB引擎(也叫NDBCLUSTER)提高了为庞大的分布式数据集提供快速的键值查找。
(四) 、CSV
CSV引擎的表格其实是具有逗号分隔值的文本文件。CSV引擎中的表允许您以 CSV 格式导入或转储数据以便与读写相同格式的脚本和应用程序交换数据。
由于 CSV 表没有索引,因此您通常可以让InnoDB引擎在正常操作期间将数据保存在表中,并且仅在导入或导出阶段使用 CSV 引擎的表。
(五) 、Archive
这种存储引擎下表是紧凑的、没有索引的,主要用于于存储和检索大量很少引用的历史、存档或安全审计信息。
(六) 、Blackhole
Blackhole 存储引擎接收但不存储数据,与 Unix/dev/null设备类似。查询总是返回一个空集。这种引擎模式下的表可用于配置复制,其中 DML 语句被发送到副本服务器,但源服务器不保留自己的数据副本。
(七) 、NDB(也叫作NDBCLUSTER)
这种集群数据库引擎特别适用于要求正常运行时间高程度保障的和高可用性的应用程序。
(八) 、Merge
这种存储引擎可以让MySQL DBA 或开发人员能够对一系列相同的MyISAM表进行逻辑分组并将它们作为一个对象引用。适用于 VLDB 环境,例如数据仓库。
(九) 、Federated
这种存储引擎提供了链接单独的MySQL服务器以从许多物理服务器创建一个逻辑数据库的能力。非常适合分布式或数据集市环境。
(十) 、Example
这个引擎作为 MySQL 源代码中的一个例子,描述了如何开始编写新的存储引擎。它可能是开发人员感兴趣的。存储引擎是一个什么都不做的 “存根”。您可以指定表使用这种存储引擎,但不能在其中存储或从中检索数据。
(十一) 、小结
您不需要对整个服务器或架构限制使用相同的存储引擎。您可以为任何表指定特定的存储引擎。例如,一个应用程序中的表可能主要使用InnoDB类型,然后定义一个CSV引擎的表用于将数据导出到电子表格,而另外定义一些 MEMORY引擎类型的表用于临时工作区,简单来说,就是可以根据自己的需求灵活定义表的存储引擎。
四: 如何选择一个存储引擎,常用的存储引擎特点对比
通过上文我们Mysql有哪些存储引擎,下面就来讲解一下常用的存储引擎的特点:
选择一个表的存储引擎时,大家可以参考上面各个存储引擎特点然后根据自己的具体业务场景去选择,一般的业务场景使用MySQL官方默认的即可,下面我主要总结一些一些需要注意的细节(主要用于面试)。
1、各个引擎的Replication support是在服务器程序中实现,而不是在存储引擎中。
2、各个引擎的Encrypted data(数据加密)是在服务器中实现。
3、在 MySQL 5.7 及更高版本中,支持静态数据加密,都是在服务器中实现的。
4、MySQL Cluster NDB 7.3 及更高版本支持外键。
5、MySQL 5.6 及更高版本支持 FULLTEXT 索引。
6、MySQL 5.7 及更高版本支持地理空间索引。
7、InnoDB存储引擎在内部利用哈希索引来实现其自适应哈希索引功能。
五: 关于存储引擎常见的面试题
5.1: InnoDB和MyISAM的区别
(一) InnoDB的特点:
1、支持事务处理、ACID事务特性,是MySQL也是MySQL默认的存储引擎(MySQL5.5以前默认存储引擎是MyISAM);;
2、实现了SQL标准的四种隔离级别;
3、支持行级锁和外键约束;
4、可以利用事务日志进行数据恢复。
5、锁级别为行锁,行锁优点是适用于高并发的频繁表修改,高并发是性能优于 MyISAM。缺点是系统消耗较大。
6、索引不仅缓存自身,也缓存数据,相比 MyISAM 需要更大的内存。
(二) MyISAM的特点:
1、锁级别为表锁,表锁优点是开销小,加锁快;缺点是锁粒度大,发生锁冲动概率较高,容纳并发能力低,这个引擎适合查询为主的业务。
2、此引擎不支持事务,也不支持外键。
3、INSERT和UPDATE操作需要锁定整个表;
3、它存储表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。
(三) 适用场景
MyISAM适合: (1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
InnoDB适合: (1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。
5.2: 如何选择Mysql的存储引擎
具体需要根据系统的业务要求选择,一般情况下使用官方默认的即可。
InnoDB: 如果对数据的完整性要求比较高,且除了插入和查询外,还存在着许多更新和删除操作的,需要使用到事务或者外键的,适用于选择InnoDB,InnoDB也是Mysql现在默认的存储引擎。
MyISAM: 以只读或者插入操作为主,很少的更新和删除操作的,并且对数据完整性要求不高的可以选择。
六、系列文章
《从0到1-全面深刻理解MySQL系列》所有文章汇总
1、《从0到1-全面深刻理解MySQL系列》- 最详细的MySQL安装流程(Window版)
2、《从0到1-全面深刻理解MySQL系列》- 最详细的MySQL安装流程(Linux环境)
3、《从0到1-全面深刻理解MySQL系列》- 忘记MySQL登录密码时如何连接数据库
七、小结
从上文我们可以知道,MySQL官方有提供10之多的存储引擎,并且各有特点,在进行数据库、表设计的时候,就要比较全面的考虑自己系统的一个业务场景来确定使用哪一种存储引擎,如果不知道如何选择的情况下,直接使用官方默认的即可,既然官方默认了这种存储引擎,说明这是官方在进行大量的试验和考量后从支持的存储引擎中选出适用于大多数系统使用场景的一个,所以不必太过担心。
最后、如果觉得文章对你有帮助,不要忘记一键三连哦,你的支持是我创作更加优质文章的动力,有任何问题可以私信我,看到会及时给你答复!