mysql存储引擎
mysql体系结构
- 连接层:
- 客户端连接器(JDBC、ODBC、…)
- 主要是接收客户端的连接,完成一些连接的处理,以及认证授权的相关操作(比如说验证用户名和密码,以及校验每一个客户端所具有的权限。),以及一些相关的安全方案,检查是否超过最大连接数等等。
- 服务层:
- 绝大部分的核心功能都是在服务层完成的,像SQL接口,查询解析器,查询优化器,查询缓存等等。所有跨存储引擎的实现也都是在服务层实现的。比如DML语句,DDL语句的封装、存储过程、视图触发器都是在服务层。
- 引擎层:
- 存储引擎(InnoDB、MyISAM、NDB、…)
- 如果现有的存储引擎不能满足我们的需求,我们还可以在其基础上扩展,所以称之为“可插拔式存储引擎”,就是说要用就加入进来,如果不用就可以把它拔掉,这个存储引擎控制的就是mysql当中数据的存储和提取的方式。
- 重点:索引是在存储引擎当中是实现的,也就意味着不同的存储引擎,索引结构是不一样的。InnoDB引擎是Mysql5.5版本以后的默认存储引擎。
- 存储层:
- 主要是讲数据存储在文件系统上,并完成与存储引擎的交互。
存储引擎简介
存储引擎就是mysql数据库当中存储数据,建立索引、更新/查询等技术的实现方式。 存储引擎是基于数据库表的,不是基于数据库的,也就是说在一个数据库的多张表是可以选择不同的存储引擎的,所以这个存储引擎也被称为表类型。
使用show engines;
可以查看当前数据库支持的存储引擎,以及各个存储引擎的特点。
- Engine:有哪些存储引擎
- Support:是否支持
- Comment:注释
- Transactions:是否支持事物
- XA:是否支持XA协议
- Savepoints:是否支持保存点
eg1:创建表 my_myisam,并指定MyISAM存储引擎。
create table my_myisam(
id int,
name varchar(40)
)engine = MyISAM;
eg2:创建表 my_memory,并指定Memory存储引擎。
create table my_memory(
id int,
name varchar(40)
)engine = MEMORY;
可以使用如下语句查看表的引擎:
show create table my_memory;
show create table my_myisam;
存储引擎特点
InnoDB:
- 介绍:
- InnoDB是一种兼顾高可靠性和高性能的通用存储引擎。在MySql5.5之后,InnoDB是默认的MySQL存储引擎。
- 特点:
- DML(增删改)操作遵循ACID模型(事务的四大特性),支持事务。
- 行级锁,提高并发访问性能(和表锁相比)。
- 支持外键FOREIGN KEY约束,保证数据的完整性和正确性。
- DML(增删改)操作遵循ACID模型(事务的四大特性),支持事务。
- 文件:
- 在InnoDB的存储引擎当中,每一个InnoDB引擎的表都会对应一个xxx.ibd(xxx是表名)的表空间文件,存放表结构的数据和索引。
- 参数:innoDB_file_per_table,mysql8.0当中这个开关是打开的,就代表每一张表都对应一个表空间文件。
- 可以使用命令
show variables like 'innodb_file_per_table';
查看参数。
- 可以在mysql安装目录下的data里面找到表对应的表空间文件,然后使用命令
ibd2sdi xxx.ibd;
命令查看ibd文件。 - 逻辑存储结构:一个表空间包含若干个段,一个段中包含若干个区,一个区包含若干个页(索引页,数据页),一个页包含若干个行(指的是在表结构中存储的一行一行的数据)。
- 在InnoDB的逻辑结构中page(页)是磁盘操作的最小单元。一个区大小固定1M,一个页大小固定16K。
MyISAM:
- 介绍:
- MySQL早期默认的存储引擎。
- 特点:
- 不支持事务,不支持外键。
- 支持表锁,不支持行锁。
- 访问速度快。
- 文件:
- .sdi文件存放表结构信息。.MYD文件存放表中的数据。.MYI文件存放索引。
- Memory
- 介绍;
- Memory引擎的表数据是存储在内存中的,由于受到硬件问题、或断电的影响,只能将这些表作为临时表或缓存使用。
- 特点:
- 内存存放,访问速度快。
- 支持Hash索引(默认)
- 文件:
- .sdi文件存储表结构信息。
- .sdi文件存储表结构信息。
- 介绍;
存储引擎选择
存储引擎是没有好坏之分的,要在合适的业务场景当中选择合适的存储引擎。
- InnoDB:支持事务,外键,行级锁。如果在某一块业务场景当中,对事务的完整性,还有在并发条件下对事务的一致性要求比较高,那InnoDB是我们唯一的选择。
- MyISAM:如果业务数据是以读取和插入为主,很少进行更新和删除操作,而且对事务的完整性和并发性要求不是很高。那么选择这个存储引擎是比较合适的。
- MEIMORY:将数据保存在内存中,访问速度快,通常用于临时表及缓存。太大的表也无法缓存在内存中,而且无法保证数据的安全性。(不如使用Redis)