数据库存储引擎只有myisam和innodb,当场被面试官赶了出来!

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 数据库存储引擎只有myisam和innodb,当场被面试官赶了出来!

上一篇我们系统学习了数据库的逻辑体系架构,它就像一棵树一样,我们学习的每一个 知识点都应该是树上面的分支,有根系的知识,才能在脑海中形成知识网,那么,接下来,我们会从根部开始一点一点往上学习, 这篇则带领大家来了解一下存储引擎。

精彩回顾:MYSQL逻辑体系架构

数据库存储引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建,查询,
更新和删除数据,不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等功能,使用不同的
存储引擎,还可以获得特定的功能,现在许多不同的数据库管理系统都支持多种不同的数据引擎
备注:因为在关系型数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型
(Table Type,即存储和操作此表的类型)

mysql存储引擎

在mysql5.5之前的版本中,默认是Myisam存储引擎,在5.5版本以后是Innodb.

MYSQL给开发者提供了查询存储引擎的功能,执行以下SQL即可查询到mysql中的存储引擎

show engines;

存储引擎之间的区别:大致可分为:1.支持的字段和数据类型

2.锁定类型

3.索引

4.处理

mysql目前支持的存储引擎有:
1、InnoDB引擎
2、MyISAM引擎
3、MERGE存储引擎
4、MEMORY引擎
5、ARCHIVE引擎
6、CSV引擎
7、BLACKHOLE引擎(黑洞引擎)
8、PERFORMANCE_SCHEMA引擎
9、Federated引擎。
共九种存储引擎

注:另外还有两种存储引擎,BDB(BerkeleyDB)引擎,NDB Cluster引擎

1、InnoDB存储引擎

InnoDB是事务型数据库的首选引擎,在5.5版本以后,也是mysql的默认事务型引擎,是目前最重要,
使用最广泛的存储引擎,支持事务安全表(ACID),支持行锁和外键

主要特性有:

  • 1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合
  • 2、InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的
  • 3、InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引,而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上
  • 4、InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果 没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键
  • 5、InnoDB被用在众多需要高性能的大型数据库站点上

设计理念:

1,InnoDB默认将数据放到一个逻辑的表空间中,这个表空间就像黑盒子一样由InnoDB自身进行管理。
从mysql4.1开始,它可以将每个 InnoDB存储引擎的表单独存放到一个独立的ibd文件中。
与orcle类似,InnoDB存储引擎同样可以使用裸设备(row disk)来建立其表空间。
2,InnoDB通过使用多版本并发控制(MVCC)来获取高并发性,并且实现了sql标准的4种隔离级别,
默认为REPEATABLE级别。同时 使用一种next-key-locking的策略来避免幻读(phantom)。
除此之外,InnoDB存储引擎还提供插入缓存(insert buffer),二次写(double write),
自适应哈希索引(adaptive hash index),预读(read ahead)等高性能和高可用的功能。

InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB 大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件。

场景:由于其支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整 性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit) 和回滚(rollback)。

2、MyISAM存储引擎

MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用
的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物和外键。

MyISAM主要特性有:

  • 1、大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持
  • 2、当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成
  • 3、每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16
  • 4、最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上
  • 5、BLOB和TEXT列可以被索引,支持FULLTEXT类型的索引,而InnoDB不支持这种类型的索引
  • 6、NULL被允许在索引的列中,这个值占每个键的0~1个字节
  • 7、所有数字键值以高字节优先被存储以允许一个更高的索引压缩
  • 8、每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列 被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新 比InnoDB类型的AUTO_INCREMENT更快
  • 9、可以把数据文件和索引文件放在不同目录
  • 10、每个字符列可以有不同的字符集
  • 11、有VARCHAR的表可以固定或动态记录长度
  • 12、VARCHAR和CHAR列可以多达64KB

存储格式:

  • 1、静态表(默认):字段都是非变长的(每个记录都是固定长度的)。存储非常迅速、容易缓存, 出现故障容易恢复;占用空间通常比动态表多。
  • 2、动态表:占用的空间相对较少,但是频繁的更新删除记录会产生碎片,需要定期执行optimize table 或myisamchk -r命令来改善性能,而且出现故障的时候恢复比较困难。
  • 3、压缩表:使用myisampack工具创建,占用非常小的磁盘空间。因为每个记录是被单独压缩的,所以 只有非常小的访问开支。

静态表的数据在存储的时候会按照列的宽度定义补足空格,在返回数据给应用之前去掉这些空格。如果需要 保存的内容后面本来就有空格,在返回结果的时候也会被去掉。(其实是数据类型char的行为,动态表中若 有这个数据类型也同样会有这个问题)

使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存 储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)。

场景:如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。

3、MERGE存储引擎

MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,尽管其使用不如其它引擎突出,
但是在某些情况下非常有用。说白了,Merge表就是几个相同MyISAM表的聚合器;Merge表中并没有数据,
对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。

场景:对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定的时间端相关。例如:可以用12个相同的表来存储服务器日志数据,每个表用对应各个月份的名字来命名。当有必要基于所 有12个日志表的数据来生成报表,这意味着需要编写并更新多表查询,以反映这些表中的信息。与其编写这 些可能出现错误的查询,不如将这些表合并起来使用一条查询,之后再删除Merge表,而不影响原来的数据, 删除Merge表只是删除Merge表的定义,对内部的表没有任何影响。

4、MEMORY存储引擎

MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。

MEMORY主要特性有:

  • 1、MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度
  • 2、MEMORY存储引擎执行HASH和BTREE缩影
  • 3、可以在一个MEMORY表中有非唯一键值
  • 4、MEMORY表使用一个固定的记录长度格式
  • 5、MEMORY不支持BLOB或TEXT列
  • 6、MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引
  • 7、MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)
  • 8、MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享
  • 9、当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE, 或者删除整个表(使用DROP TABLE)

MEMORY存储引擎默认使用哈希(HASH)索引,其速度比使用B-+Tree型要快,但也可以使用B树型索引。由于这种存储引擎所存储的数据保存在内存中,所以其保存的数据具有不稳定性,比如如果mysqld进程发生异常、 重启或计算机关机等等都会造成这些数据的消失,所以这种存储引擎中的表的生命周期很短,一般只使用一次。现在 mongodb、redis等NOSQL数据库愈发流行,MEMORY存储引擎的使用场景越来越少。

场景:如果需要该数据库中一个用于查询的临时表。

另外:

虽然使用哈希算法实现的索引虽然可以做到快速检索数据,但是没办法做数据高效范围查找,因此哈希索引是不适
合作为 Mysql 的底层索引的数据结构

5、ARCHIVE存储引擎

Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。在
MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。Archive拥有很
好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。

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

6、CSV存储引擎

使用该引擎的MySQL数据库表会在MySQL安装目录data文件夹中的和该表所在数据库名相同的目录中生成一
个.CSV文件(所以,它可以将CSV类型的文件当做表进行处理),这种文件是一种普通文本文件,每个数据行占
用一个文本行。该种类型的存储引擎不支持索引,即使用该种类型的表没有主键列;另外也不允许表中的字段为
null。csv的编码转换需要格外注意

场景:这种引擎支持从数据库中拷入/拷出CSV文件。如果从电子表格软件输出一个CSV文件,将其存放在MySQL 服务器的数据目录中,服务器就能够马上读取相关的CSV文件。同样,如果写数据库到一个CSV表,外部程序也可 以立刻读取它。在实现某种类型的日志记录时,CSV表作为一种数据交换格式,特别有用。

7、BLACKHOLE存储引擎(黑洞引擎)

该存储引擎支持事务,而且支持mvcc的行级锁,写入这种引擎表中的任何数据都会消失,主要用于做日志记录或
同步归档的中继存储,这个存储引擎除非有特别目的,否则不适合使用。

场景:如果配置一主多从的话,多个从服务器会在主服务器上分别开启自己相对应的线程,执行binlogdump命令 而且多个此类进程并不是共享的。为了避免因多个从服务器同时请求同样的事件而导致主机资源耗尽,可以单独 建立一个伪的从服务器或者叫分发服务器。

8、PERFORMANCE_SCHEMA存储引擎

该引擎主要用于收集数据库服务器性能参数。这种引擎提供以下功能:提供进程等待的详细信息,包括锁、互斥
变量、文件信息;保存历史的事件汇总信息,为提供MySQL服务器性能做出详细的判断;对于新增和删除监控事件
点都非常容易,并可以随意改变mysql服务器的监控周期,例如(CYCLE、MICROSECOND)。MySQL用户是不能创
建存储引擎为PERFORMANCE_SCHEMA的表。

场景: DBA能够较明细得了解性能降低可能是由于哪些瓶颈。

9、Federated存储引擎

该存储引擎可以将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。这种存储引擎非常适合数据库分
布式应用。

Federated存储引擎可以使你在本地数据库中访问远程数据库中的数据,针对federated存储引擎表的查询会被发 送到远程数据库的表上执行,本地是不存储任何数据的

缺点:

  • 1、对本地虚拟表的结构修改,并不会修改远程表的结构
  • 2、truncate 命令,会清除远程表数据
  • 3、drop命令只会删除虚拟表,并不会删除远程表
  • 4、不支持 alter table 命令
  • 5、select count(*), select * from limit M, N 等语句执行效率非常低,数据量较大时存在很严重的问题, 但是按主键或索引列查询,则很快,如以下查询就非常慢(假设 id 为主索引)
select id from db.tablea where id > 100 limit 10 ;
  • 而以下查询就很快:
select id from db.tablea where id >100 and id<150
  • 6、如果虚拟虚拟表中字段未建立索引,而实体表中为此字段建立了索引,此种情况下,性能也相当差。但是当 给虚拟表建立索引后,性能恢复正常
  • 7、类似 where name like "str%" limit 1 的查询,即使在 name 列上创建了索引,也会导致查询过慢,是 因为federated引擎会将所有满足条件的记录读取到本地,再进行 limit 处理。

场景: dblink。

10、BerkeleyDB存储引擎

BerkeleyDB(简称为BDB)是一种以key-value为结构的嵌入式数据库引擎:
  • 嵌入式:bdb提供了一系列应用程序接口(API),调用这些接口很简单,应用程序和bdb所提供的库一起编译/链 接成为可执行程序;
  • NOSQL:bdb不支持SQL语言,它对数据的管理很简单,bdb数据库包含若干条记录,每条记录由关键字和数据 (key-value)两部分构成。数据可以是简单的数据类型,也可以是复杂的数据类型,例如C语言的结构体,bdb 对数据类型不做任何解释,完全由程序员自行处理,典型的C语言指针的自由风格;

总结

本篇文章讲解了共10种存储引擎的种类与特性,下期类容我们即将深入学习InnoDB存储引擎,关注加收藏,持续学习不掉队哦。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
6天前
|
存储 安全 关系型数据库
InnoDB引擎特性
InnoDB事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。MySQL5.5.5之后,InnoDB作为默认存储引擎,InnoDB主要特性有: InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供了一个类似Oracle的非锁定读。 InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘关系的数据库引擎所不能匹敌的。 InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池
|
7天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的InnoDB存储引擎
InnoDB是MySQL的默认存储引擎,广泛应用于互联网公司。它支持事务、行级锁、外键和高效处理大量数据。InnoDB的主要特性包括解决不可重复读和幻读问题、高并发度、B+树索引等。其存储结构分为逻辑和物理两部分,内存结构类似Oracle的SGA和PGA,线程结构包括主线程、I/O线程和其他辅助线程。
【赵渝强老师】MySQL的InnoDB存储引擎
|
13天前
|
存储 关系型数据库 MySQL
数据库引擎之InnoDB存储引擎
【10月更文挑战第29天】InnoDB存储引擎以其强大的事务处理能力、高效的索引结构、灵活的锁机制和良好的性能优化特性,成为了MySQL中最受欢迎的存储引擎之一。在实际应用中,根据具体的业务需求和性能要求,合理地使用和优化InnoDB存储引擎,可以有效地提高数据库系统的性能和可靠性。
33 5
|
28天前
|
安全 NoSQL 关系型数据库
阿里云数据库:助力企业数字化转型的强大引擎
阿里云数据库:助力企业数字化转型的强大引擎
|
2月前
|
存储 SQL 缓存
InnoDB 存储引擎以及三种日志
InnoDB 存储引擎以及三种日志
27 0
|
3月前
|
缓存 运维 监控
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
打造稳定高效的数据引擎:数据库服务器运维最佳实践全解析
|
3月前
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
71 6
|
4月前
|
存储 SQL 关系型数据库
(十三)MySQL引擎篇:半道出家的InnoDB为何能替换官方的MyISAM?
MySQL是一款支持拔插式引擎的数据库,在开发过程中你可以根据业务特性,从支持的诸多引擎中选择一款适合的,例如MyISAM、InnoDB、Merge、Memory(HEAP)、BDB(BerkeleyDB)、Example、Federated、Archive、CSV、Blackhole.....
|
4月前
|
canal 消息中间件 缓存
面试题:如何解决缓存和数据库的一致性问题?
面试题:如何解决缓存和数据库的一致性问题?
86 1