文章目录
- 什么是存储引擎👋?
 - 指定存储引擎✅
 - 查看mysql提供什么存储引擎
 - 查看mysql当前默认的存储引擎
 - 修改mysql默认的存储引擎
 - 设置表的存储引擎
 
- 常用存储引擎🧰
 - InnoDB
 - MyISAM
 - Memory
 - InnoDB 和 MyISAM的区别
 
什么是存储引擎👋?
在学习存储引擎之前,我们需要了解存储引擎在MySQL数据库服务器中所占的地位和作用!
 
 首先系统地介绍一下MySQL数据库服务器的体系结构:
-  
首先第一层:连接层。 它的作用是:接收客户端连接,完成连接的处理,认证授权,安全方案,检查是否超过最大连接数…… 其中认证授权就是我们在使用用户名和密码登陆的时候的过程,并赋予该用户对应的权限
 -  
再就是第二层:服务层。 核心功能基本上都在这一层完成:SQL接口、解析器、查询优化器、缓存,像创建存储过程、视图、触发器这些都在服务层完成
 -  
第三层:引擎层。 真正的负责了MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作。上图中一个个紫色的圆筒就是不同种类的存储引擎,其中第一个就是我们常用的
innodb,上图中是MySQL提供给我们的存储引擎,而我们自己也可以对存储引擎进行扩展 它被称为:可插拔式存储引擎,类似于接口,我们需要就把它插上来,不需要就把它拔掉。存储引擎控制的是我们的数据存储和拿取的方式! -  
最后一层:存储层。 引擎层只是决定了我们如何去存取数据,而数据实际上是存储在磁盘中的,同时,数据库的日志也会存储在磁盘当中
 
说了这么多,但是什么是存储引擎呢?
- 存储引擎就是存储数据、处理和保护数据等技术的实现方式。(在物理上如何表示记录,怎么从表中读取数据,以及怎么把数据写入具体的物理存储器上,都是存储引擎负责的事情)
 
指定存储引擎✅
查看mysql提供什么存储引擎
show engines;
# 或者
show engines \G;
 

查看mysql当前默认的存储引擎
show variables like '%storage_engine%';
# 或者
SELECT @@default_storage_engine;
 

修改mysql默认的存储引擎
SET DEFAULT_STORAGE_ENGINE=MyISAM;
# 或者修改 my.cnf 文件并且重启mysql
default-storage-engine=MyISAM # 重启服务 systemctl restart mysqld.service
 

设置表的存储引擎
存储引擎是基于表的,也就是说一张表使用一个 存储引擎,数据库中的不同表的存储引擎不一定相同,存储引擎因此可以被称为表类型。
创建表时可以通过ENGINE来指定存储引擎,在create语句最后加上ENGINE = 存储引擎名称即可。如果建表语句中没有指定表的存储引擎,那就会使用默认的存储引擎 。
CREATE TABLE 表名( 
  	建表语句; 
) ENGINE = 存储引擎名称;
 

 如果表已经建好了,我们也可以使用下边这个语句来修改表的存储引擎:
ALTER TABLE 表名 ENGINE = 存储引擎名称;
 

 我们通过查看表结构发现存储引擎已被修改。
 
常用存储引擎🧰
InnoDB和MyISAM是MySQL中比较常用的两个存储引擎,MySQL 在 5.5 之前版本默认存储引擎是 MyISAM,5.5 之后版本默认存储引擎是 InnoDB,MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用。
- 如果业务需要高度的数据完整性和事物支持,那么InnoDB是更好的选择。所以频繁修改以及数据安全性的情况适合;
 - 如果业务主要是读取操作,或者需要高校的全文搜索功能,那么MyISAM 可能更适合。所以查询频繁的适合。
 
InnoDB
具备外键支持功能的事务存储引擎 ,MySQL从3.23.34a开始就包含InnoDB存储引擎。 大于等于5.5之后,默认采用InnoDB引擎 。 InnoDB是MySQL的 默认事务型引擎 ,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)。
它的特点可以用数据库中查询出来的COMMENT中的三点来概括:
-  
Supports transactions:支持事务。在使用InnoDB作为存储引擎的时候,进行DML操作的时候遵循ACID模型,支持事务-  
DML:对于数据的增删改操作 -  
ACID:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durablility) 
 -  
 -  
row-level locking:行级别锁。提高并发访问的性能。 -  
foreign keys:支持外键约束,保证数据的完整性和正确性 
除此之外还需要谈谈其数据文件结构
- 它存储数据库文件的类型为
xxx.ibd,其中xxx表示表名,也就是说每一个使用InnoDB存储引擎的表都会对应一个ibd文件,存储该表的表结构(frm,sdi)、数据和索引。- 其中表结构文件,早期的时候有一个文件叫
frm,表结构都存储在这个里面,但是后来在MySQL8.0,以后,表结构都存储在了sdi文件中,而sdi又融入到了ibd文件中。 
 - 其中表结构文件,早期的时候有一个文件叫
 
不妨去看看寻找一下ibd文件吧,该文件是二进制编码,我们无法直接打开,可以通过命令ibd2sdi,从ibd文件中提取sdi的表结构数据。
 
其他, 查看创建表的存储路径
show variables like 'datadir'终端输入回车,然后输入密码即可
sudo chmod -R a+rwx /usr/local/mysql/data
MyISAM
主要的非事务处理存储引擎,5.5之前默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,说它的特点我们可以与现在的默认存储引擎InnoDB进行对比
- MyISAM 不支持事务,也不支持外键
 - MyISAM 不支持行锁,但是支持表锁
 - 由于不保证它的事务,因此它的访问速度更快
 
而MyISAM涉及到的存储文件的类型有三种:MYD,MYI,SDI
- xxx.sdi 用于存储表结构
 - xxx.MYD 用于存储数据 (MYData)
 - xxx.MYI 用于存储索引 (MYIndex)
 

Memory
Memory内存,它的表数据是存储在内存中的,响应速度很快 ,但容易受宕机、断电……的影响,导致数据丢失。另外,要求存储的数据是数据长度不变的格式,比如,Blob和Text类型的数据不可用(长度不固定的)。 一般 MEMORY 存储引擎用于临时表和缓存。它的特点由于和前面两种存储引擎类型不同,所以不做比较
- Memory同时 支持哈希(HASH)索引 和 B+树索引
 - 它由于是内存存放,因此访问速度很快
 - MEMORY 表的大小是受到限制 的。表的大小主要取决于两个参数,分别是 max_rows 和 max_heap_table_size 。其中,max_rows可以在创建表时指定;max_heap_table_size的大小默认为16MB,可以按需要进行扩大。
 
MEMORY数据是存储在内存中,故只需要sdi文件去记录表结构即可
 
InnoDB 和 MyISAM的区别
两者主要有以下区别
- InnoDB 支持事务,MyISAM不支持;
 - InnoDB 主键是聚集索引,而MyISAM 是非聚集索引;(InnoDB中索引和数据在一起,MyISAM采用了一种索引和数据分离的存储方式)
 - InnoDB 支持外键,MyISAM不支持;
 - InnoDB 最小锁粒度的行锁,MyISAM 最小锁粒度是表锁;
 - InnoDB在mysql5.6版本之前不支持全文索引;(innodb 从1.2.x 开始才增加了全文索引支持。而MySQL5.6版本中innodb的版本才升级到 1.2.x。)
 - InnoDB中不保存表的行数,但MyISAM中有保存表的行数;
 - 对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引;
 - 清空整个表时,InnoDB是一行一行的删除,效率非常慢。而MyISAM则会重建表
 



















