目录
- 存储引擎
- MySQL的体系结构
- 存储引擎简介
- InnoDB存储引擎
- MyISAM存储引擎
- Memory存储引擎
- InnoDB,MyISAM和Memory的区别
- 存储引擎的选择
- 小结
存储引擎
MySQL的体系结构
-
MySQL的体系结构图:
MySQL服务端的体系结构(MySQL Server):
分层,分为连接层,服务层,存储引擎层,存储层。 -
连接层:
主要是接收客户端的连接,完成一些连接处理,以及一些认证授权的操作(例如用户的登录等),一些安全方案,检查是否超过最大连接数等 -
服务层:
绝大多数核心功能都是在服务层完成的,像SQL接口,查询解析器,查询优化器,查询缓存,所有的跨存储引擎的实现也都是在服务层完成的 -
存储引擎层:
MySQL本身提供了很多的存储引擎,如果感觉不行还可以进行扩展,存储引擎控制的就是MySQL中数据提取和存入的方式,服务器会通过API和存储引擎进行通信,交互,索引就是在存储引擎层实现的,不同的存储引擎索引的结构是不一样的 -
存储层:
数据存储的地方
存储引擎简介
存储引擎是MySQL中特有的
存储引擎就是存储数据,建立索引,更新/查询数据等技术的实现方式。存储引擎是基于表
的,而不是基于库,所以存储引擎也可被称为表类型
一个数据库下的多张表可以选择不同的存储引擎
MySQL默认的存储引擎是InnoDB
查询建表语句:
show create table 表名;-- 可以查询到建立这张表的SQL语句
show create table account;
CREATE TABLE `account` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(10) DEFAULT NULL COMMENT '姓名',
`money` int DEFAULT NULL COMMENT '储蓄',
PRIMARY KEY (`id`)
)
ENGINE=InnoDB -- 默认存储引擎InnoDB
AUTO_INCREMENT=3 -- 自增的下一个id值
DEFAULT CHARSET=utf8mb4 -- 当前表的字符集
COLLATE=utf8mb4_0900_ai_ci -- 默认排序方式
COMMENT='账户表'
- 创建表时指定存储引擎:
CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段1注释],
......
字段n 字段n类型 [COMMENT 字段n注释]
)ENGINE=INNODB[COMMENT 表注释] -- 这里engine后跟的就是存储引擎名
create table 表名(
字段1 字段1类型 [comment 字段1注释],
......
字段n 字段n类型 [comment 字段n注释]
)engine=innodb[comment 表注释] -- 这里engine后跟的就是存储引擎名
- 查看当前数据库支持的存储引擎:
SHOW ENGINES;
show engines;
练习:
create table my_myisam(
id int primary key auto_increment comment 'ID',
name varchar(10) comment 'name'
)engine =myisam;
show create table my_myisam;
CREATE TABLE `my_myisam` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(10) DEFAULT NULL COMMENT 'name',
PRIMARY KEY (`id`)
) ENGINE=MyISAM
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_0900_ai_ci
InnoDB存储引擎
InnoDB存储引擎是MySQL中一种兼顾高可靠性和高性能的通用存储引擎,在MySQL5.5之后,InnoDB就是MySQL的默认存储引擎;
-
InnoDB的特点:
1.InnoDB的DML操作遵循ACID(事务的四大特性)模型,支持事务。2.行级锁,提高并发访问性能
3.支持外键FOREIGN KEY(foreign key)约束,保证数据的完整性和正确性
用三个词概括就是:事务,外键,行级锁
-
InnoDB引擎所涉及到的磁盘文件:
在InnoDB中,每一个表都会对应一个表空间文件(xxx.ibd,xxx是表名),这个文件会存储该表的:表结构(frm,sdi),数据和索引此外还有一个参数:innodb_file_per_table
这个参数可以决定是多张表共用一个表文件还是一张表对应一个表文件,打开就代表一张表对应一个表文件,关闭相反,MySQL默认打开查看参数innodb_file_per_table的状况:
show variables like 'innodb_file_per_table';
使用指令:
idb2sdi 表名.idb
可以查看idb文件的情况 -
InnoDB引擎的逻辑存储结构
主要分为5段:
1.TableSpece:表空间
2.Segment:段
3.Extent:区
4.Page:页
5.Row:行
MyISAM存储引擎
MyISAM是MySQL早期的默认存储引擎
- MyISAM存储引擎特点:
1.不支持事务,不支持外键
2.支持表锁,不支持行锁
3.访问速度块
-
MyISAM存储引擎所涉及到的磁盘文件
有三个:xxx.MYD, xxx.MYI, xxx.sdi(xxx是表名)MYD:存储数据
sdi:存储表结构信息
MYI:存储索引
Memory存储引擎
Memory存储引擎的表数据存放在内存中,由于数据存放在内存中,所以会收到硬件或断电问题的影响,这些影响可能会导致数据丢失,所以,使用Memory存储引擎的表一般当作临时表或缓存使用
-
Memory存储引擎的特点:
1.数据存放在内存中。访问速度块2.默认是hash索引
-
Memory存储引擎所涉及到的磁盘文件
只有xxx.sdi文件,用来存放表的结构信息,表的数据等信息都存放在内存中
InnoDB,MyISAM和Memory的区别
存储引擎的选择
在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎,对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合
-
InnoDB的应用场景
如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新,删除操作,那么使用InnoDB存储引擎是比较合适的选择,例如:业务中的日志数据,电商中评论和足迹等 -
MyISAM的应用场景
如果应用是以读取操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择MyISAM是很合适的 -
Memoey的应用场景
因为Memoey将数据存放在内存中,访问速度块,所以常用于临时表和缓存,Memory的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性
绝大多数使用的存储引擎还是InnoDB,后面两个都被新的数据库的存储引擎给替代了