您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

MySQL数据库体系机构基本介绍!MySQL中四种主要的存储引擎

时间:2022-05-07 14:13:54  来源:掘金  作者:众星十一

MySQL的体系结构

MySQL数据库体系机构基本介绍!MySQL中四种主要的存储引擎

 

  • MySQL由以下组件组成: Connection Pool : 连接池组件 Management Services & Utilities : 管理服务和工具组件 SQL Interface : SQL接口组件 Parser : 查询分析器组件 Optimizer : 优化器组件 Caches & Buffers : 缓冲池组件 Pluggable Storage Engines : 插件式存储引擎组件 File System : 文件系统 Files & Logs : 文件和日志
  • MySQL的各个层级: 连接层: 连接层是最上层的一些客户端和连接服务,包含本地Socket通信和大多数基于客户端或者服务端工具实现的类似于TCP/IP的通信 用于完成关于连接处理,授权认证和相关的安全方案 连接层中引入了线程池的概念,可以为通过安全认证接入的客户端提供处理线程 连接层中可以实现基于SSL的安全连接 服务器会验证每一个安全接入的客户端的操作权限 服务层: 服务层主要用来完成数据库服务器的大部分核心功能.比如SQL接口,缓存的查询 ,SQL的分析和优化,内置函数的执行功能等. 所有与跨存储引擎的相关功能也在服务层实现,比如存储过程和存储函数等 在服务层中,数据库服务器会解析查询并创建对应的内部解析树,并完成相应的优化.比如确定表的查询顺序,是否利用索引等,最后生成相应的执行操作 如果是SELECT查询语句,服务器会查询内部的缓存来获取数据.因此如果有足够大的缓存空间,可以在提升大量读操作环境中的系统性能 引擎层: 存储引擎 .MySQL中的存储引擎负责MySQL中数据的存储和读取,服务器是通过API和存储引擎进行通信的 不同的存储引擎具有不同的功能,可以根据实际需要,选取合适的存储引擎 存储层: 数据存储层 .MySQL中的数据存储层主要是将数据存储在文件系统上,并且完成与存储引擎的交互
  • MySQL数据库服务器与其余的数据库服务器相比,MySQL数据库服务器的架构可以在不同的场景下应用并发挥良好的作用.主要体现在存储引擎上: 插件式的存储引擎架构. 将查询处理和其余系统任务以及数据的存储提取相分离 这样的业务架构是的可以根据业务的需求和实际需要选择合适的存储引擎

存储引擎

基本概念

  • MySQL中存在一个存储引擎的概念,针对不同的存储需求可以选择最优化的存储引擎
  • 存储引擎: 存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式 存储引擎是表类型的.因为存储引擎是基于表的,而不是基于数据库的
  • MySQL和只有一种存储引擎的Oracle,SqlServer等数据库相比较 ,MySQL是一种插件式的存储引擎架构.在MySQL中存在多种存储引擎,可以根据需要使用相应的存储引擎或者自定义编写存储引擎
  • MySQL中支持的存储引擎: InnoDB MyISAM BDB MEMORY MERGE EXAMPLE NDB Cluster AERCHIVE CSV BLACKHOLE FEDERATED 这里InnoDBBDB是事务安全表,其余的存储引擎是非事务安全表
  • MySQL数据库中创建新表如果不指定存储引擎,就会使用默认的存储引擎.在MySQL 5.5版本之前默认的存储引擎是MyISAM, 在MySQL 5.5版本之后默认的存储引擎是InnoDB
  • 使用命令查询当前数据库支持的存储引擎:
show engines;
  • 使用命令查询当前数据库中存储引擎相关的参数:
show variables like '%storage_engine%';

存储引擎特性

  • 几种常用的存储引擎的特性比较:

 

InnoDB

MyISAM

MEMORY

MERGE

NDB Cluster

存储限制

64 TB

限制

限制

无限制

限制

事务安全

支持

不支持

不支持

不支持

不支持

锁机制

行级锁. 适合高并发

表级锁

表级锁

表级锁

行级锁

外键

支持

不支持

不支持

不支持

不支持

B树索引

支持

支持

支持

支持

支持

哈希索引

不支持

不支持

支持

不支持

不支持

全文索引

支持

支持

不支持

不支持

不支持

集群索引

支持

不支持

不支持

不支持

不支持

数据索引

支持

不支持

支持

不支持

支持

索引缓存

支持

支持

支持

支持

支持

数据可压缩

不支持

支持

不支持

不支持

不支持

空间使用

N/A

内存使用

中等

批量插入速度

InnoDB

  • InnoDB存储引擎是MySQL数据库服务器的默认存储引擎
  • InnoDB存储引擎提供具有提交,回滚,崩溃恢复的事务安全机制
  • InnoDB存储引擎和MyISAM存储引擎相比较存在的缺点: 处理效率比较低 为了保存数据和索引会占用更多的磁盘空间
  • 事务安全:
-- 开启事务 : 开启事务后,可以进行数据库的相关操作
start transaction;

-- 提交事务 : 进行数据库的相关操作后,可以提交事务
commit;
  • 外键约束: MySQL数据库服务器中只有InnoDB存储引擎支持外键 创建外键时,要求外键表对应的外键字段必须要有索引 使用外键的表在创建外键时,会自动创建对应的索引 示例: -- 外键表 CREATE TABLE country( id int NOT NULL AUTO_INCREMENT, country_name varchar(100) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 使用外键的表 CREATE TABLE city( id int NOT NULL AUTO_INCREMENT, city_name varchar(50) NOT NULL, country_id int NOT NULL, PRIMARY KEY(id), KEY idx_fk_country_id(country_id), CONSTRAINT 'fk_city_country' FOREIGN KEY(country_id) REFERENCES country(id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 复制代码 更新外键表信息时,使用外键的表的外键相关信息也会自动更新
  • 存储方式: InnoDB存储表和索引有两种方式: 共享表空间存储: 创建的表的表结构存储在 .frm文件中 数据存储在innodb_data_home_dir定义的表空间中,可以是多个文件 索引存储在innodb_data_file_path定义的表空间中,可以是多个文件 多表空间存储: 创建的表的表结构存储在 .frm文件中 每个表的数据单独存储在 .ibd文件中 每个表的索引单独存储在 .ibd文件中

MyISAM

  • MyISAM存储引擎不支持事务,不支持外键 适合对事务的完整性没有要求的应用 适合以SELECT或者INSERT为主要操作的应用
  • MyISAM的优点是访问速度快
  • 不支持事务
  • 存储方式: 每个MyISAM存储引擎的表在磁盘上存储为三个文件,文件名都和表名相同,拓展名有以下三种: .frm - 创建的表的表结构 .MYD - MYDATA. 创建的表的数据 .MYI - MYIndex. 创建的表的索引

MEMORY

  • MEMORY存储引擎将表的数据存储在内存中
  • 每个MEMORY存储引擎的表对应一个 .frm文件: .frm文件中只存储创建的表的表结构 表的数据都是存储在内存中
  • MEMORY的数据都是存储在内存中,并且默认使用HASH索引
  • 优点: 数据存储在内存中,有利于数据的快速处理,提高整个表的效率 MEMORY存储引擎的表访问的速度非常快
  • 缺点: 不支持事务,不支持外键 如果服务关闭 ,MEMORY存储引擎的表的表中的数据就会丢失

MERGE

  • MERGE存储引擎的表是一组MyISAM存储引擎的表的组合 MyISAM存储引擎的表的结构必须完全相同 MERGE存储引擎的表不存储数据 MERGE存储引擎的表的查询,更新和删除操作都是对内部的MyISAM存储引擎的表的操作
  • MERGE存储引擎的表的插入操作: 通过INSERT_METHOD子句定义插入的表,可以有3个不同的值 FIRST: 插入操作作用在第一个MyISAM存储引擎的表上 LAST: 插入操作作用在最后一个MyISAM存储引擎的表上 NO: 不定义子句或者将子句定义为NO, 表明不能对MEGER存储引擎的表的内部的MyISAM存储引擎的表进行插入操作
  • DROP: 对MERGE存储引擎的表执行DROP操作,只是删除MERGE存储引擎的表的定义,对MERGE存储引擎的表的内部的MyISAM存储引擎的表没有任何影响
  • 示例:
-- MyISAM存储引擎的表
CREATE TABLE orderA(
	id int AUTO_INCREMENT,
	order_money double(10,2),
	order_address vachar(64),
	PRIMARY KEY(id)
)ENGINE=myisam DEFAULT CHARSET=utf8;

-- MyISAM存储引擎的表
CREATE TABLE orderB(
	id int AUTO_INCREMENT,
	order_money double(10,2),
	order_address varchar(64),
	PRIMARY KEY(id)
)ENGINE=myisam DEFAULT CHARSET=utf8;

-- MERGE存储引擎的表
CREATE TABLE order_all(
	id int AUTO_INCREMENT,
	order_money double(10,2),
	order_address varchar(64),
	PRIMARY KEY(id)
)ENGINE=merge 
UNION=(orderA,orderB)
INSERT_METHOD=LAST DEFAULT CHARSET=utf8

存储引擎使用场景

  • 选择存储引擎时,需要根据应用系统的特点选择合适的存储引擎
  • 对于复杂的应用系统,可以根据实际情况选择多种存储引擎进行组合
  • 常见的几种存储引擎的使用场景:

InnoDB: MySQL的默认存储引擎.支持事务的处理,支持外键 适合应用于应用系统对事务的完整性有比较高的要求,在并发的条件下要求数据的一致性,数据操作除了插入和查询以外,还包含很多的更新,删除操作 InnoDB存储引擎可以有效降低删除和更新导致的锁定,可以确保事务的完整提交和回滚 InnoDB引擎适合于类似计费系统和财务系统等对数据准确性要求很高的应用系统

  • MyISAM: 适合应用于应用系统以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性,并发性要求不高
  • MEMORY: 将所有的数据存储在内存中,在需要快速定位记录和类似的数据应用场景下,可以非常高效的访问数据 但是MEMORY引擎对存储表的大小有限制,无法将数据量很大的表存储到内存中 需要策略保证MEMORY引擎的表的数据可以恢复,保证数据库异常中止后 ,MEMORY存储引擎的表中的数据可以恢复 MEMORY存储引擎适合应用于不频繁进行更新的小表,可以非常高效的访问数据
  • MERGE: MERGE存储引擎是将一系统相同数据结构的MyISAM存储引擎的表以逻辑方式组合在一起,并作为一个对象来进行引用 MERGE存储引擎的表突破了对单个MyISAM存储引擎的表的大小限制,通过将不同的MyISAM存储引擎的表分布在多个磁盘上,提高MERGE存储引擎的表的数据的访问效率 MERGE存储引擎适合应用于数据仓储等相关的VLDB环境
MySQL数据库体系机构基本介绍!MySQL中四种主要的存储引擎

 

原文链接:
https://juejin.cn/post/7090909280609665031



Tags:MySQL   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  Search: MySQL  点击:(10)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  Search: MySQL  点击:(18)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  Search: MySQL  点击:(14)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  Search: MySQL  点击:(29)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10  Search: MySQL  点击:(14)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  Search: MySQL  点击:(33)  评论:(0)  加入收藏
MySQL数据恢复,你会吗?
今天分享一下binlog2sql,它是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。主要...【详细内容】
2024-02-22  Search: MySQL  点击:(54)  评论:(0)  加入收藏
如何在MySQL中实现数据的版本管理和回滚操作?
实现数据的版本管理和回滚操作在MySQL中可以通过以下几种方式实现,包括使用事务、备份恢复、日志和版本控制工具等。下面将详细介绍这些方法。1.使用事务:MySQL支持事务操作,可...【详细内容】
2024-02-20  Search: MySQL  点击:(54)  评论:(0)  加入收藏
为什么高性能场景选用Postgres SQL 而不是 MySQL
一、 数据库简介 TLDR;1.1 MySQL MySQL声称自己是最流行的开源数据库,它属于最流行的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。LAMP...【详细内容】
2024-02-19  Search: MySQL  点击:(39)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  Search: MySQL  点击:(55)  评论:(0)  加入收藏
▌简易百科推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  爱可生开源社区    Tags:MySQL   点击:(10)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  爱可生开源社区  微信公众号  Tags:MySQL   点击:(18)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  MySQL学习  微信公众号  Tags:MySQL   点击:(14)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  字节跳动技术团队    Tags:ByteHouse   点击:(29)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10    dbaplus社群  Tags:MySQL   点击:(14)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  转转技术  微信公众号  Tags:MySQL   点击:(33)  评论:(0)  加入收藏
MySQL数据恢复,你会吗?
今天分享一下binlog2sql,它是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。主要...【详细内容】
2024-02-22  数据库干货铺  微信公众号  Tags:MySQL   点击:(54)  评论:(0)  加入收藏
如何在MySQL中实现数据的版本管理和回滚操作?
实现数据的版本管理和回滚操作在MySQL中可以通过以下几种方式实现,包括使用事务、备份恢复、日志和版本控制工具等。下面将详细介绍这些方法。1.使用事务:MySQL支持事务操作,可...【详细内容】
2024-02-20  编程技术汇    Tags:MySQL   点击:(54)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  数据库干货铺  微信公众号  Tags:MySQL   点击:(55)  评论:(0)  加入收藏
mysql索引失效的场景
MySQL中索引失效是指数据库查询时无法有效利用索引,这可能导致查询性能显著下降。以下是一些常见的MySQL索引失效的场景:1.使用非前导列进行查询: 假设有一个复合索引 (A, B)。...【详细内容】
2024-01-15  小王爱编程  今日头条  Tags:mysql索引   点击:(88)  评论:(0)  加入收藏
站内最新
站内热门
站内头条