学习配套视频:黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、MySQL优化全囊括 https://www.bilibili.com/video/BV1Kr4y1i7ru?p=158&spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=bf4eb9e00649104ee4ec443e363be4b6
1 存储引擎
1.1 MySQL体系结构
- 连接层:接收客户端连接,认证授权
- 服务层:核心服务,例如:DML,DDL,存储过程,视图,触发器
- 引擎层:可插拔式存储引擎,索引也在引擎层,因为不同存储引擎索引的结构是不同的
- 存储层:数据是存储在磁盘文件中的,日志(查询日志,慢查询日志)、锁、索引、二进制制。
1.2 存储引擎简介
- 概念
- 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。基于表的。
- 查看表的存储引擎
mysql> show create table emp;
- 通过此命令可以看到当时的建表语句,engine后面就是跟的表的存储引擎
| emp | CREATE TABLE `emp` (
`EMPNO` int(4) NOT NULL,
`ENAME` varchar(10) DEFAULT NULL,
`JOB` varchar(9) DEFAULT NULL,
`MGR` int(4) DEFAULT NULL,
`HIREDATE` date DEFAULT NULL,
`SAL` double(7,2) DEFAULT NULL,
`COMM` double(7,2) DEFAULT NULL,
`DEPTNO` int(2) DEFAULT NULL,
PRIMARY KEY (`EMPNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 建表时指定存储引擎
CREATE TABLE 表名(
字段1 字段1类型 [ COMMENT 字段1注释 ] ,
......
字段n 字段n类型 [COMMENT 字段n注释 ]
) ENGINE = INNODB [ COMMENT 表注释 ] ;
mysql> create table my_myisam(
-> id int,
-> name varchar(10)
-> ) engine = MyISAM;
Query OK, 0 rows affected (0.02 sec)
- 查看当前数据库支持的存储引擎
mysql> show engines;
发现InnoDB是support列下面是default,即默认的存储引擎:支持事务、行级锁、外键
1.3 存储引擎特点
- InnoDB存储引擎
-
含义:是一种兼顾高可靠性和高性能的通用存储引擎。
-
特点:
- DML操作遵循ACID模型,支持事务
- 行级锁,提高并发访问性能
- 支持外键FK
-
文件存储:
- xxx.ibd,表空间文件,存储了该表的表结构(frm,sdi),数据,索引
- 参数:innodb_file_per_table表示每张表对应一个表空间
mysql> show variables like 'innodb_file_per_table'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | OFF | +-----------------------+-------+ 1 row in set (0.00 sec)
- InnoDB的逻辑存储结构:待加强了解
- page是磁盘操作的最小单元16K,extend的大小固定1M,一个区可以包含64个页
- MyISAM存储引擎
-
含义:是MySQL早期的默认存储引擎
-
特点:
- 不支持事务,不支持外键
- 支持表锁,不支持行锁
- 访问速度快
-
文件存储:
- MySQL5.5版本
- MySQL8版本
- Memory存储引擎
- 介绍:表数据存储在内存中,将表作为临时表或者缓存作用
- 特点:
- 内存存放
- hash索引(默认)
- 文件:
- xxx.sdi :存储表结构信息
- 其他的表数据存在内存中了
- 三者特点比较
1.4 存储引擎选择
- InnoDB:对事务要求高、并在并发条件要求数据一致、除查和增外,还需要改删。
- MyISAM:查和增操作为主,很少的改和删,对事务完整性和并发要求不高。
- 例如业务系统的日志的数据,电商的足迹、评论的数据
补充:一般用MyISAM的存储引擎都会被现在的Nosql数据库(非关系型数据库),例如MangoDB,Redis。
- MEMORY:用于临时表和缓存。缺陷是对表的大小有限制,太大没法缓存内存中。
补充:Redis是存储在内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它是NoSQL数据库,基于高性能的Key-Value、并提供多种语言的 API的非关系型数据库。