MySQL高级篇之存储引擎
特别鸣谢 "康师傅"
文章目录
1. 先入为主
1.1查看MySQL支持的存储引擎
SHOW ENGINES;
1.2默认存储引擎的查看
#方法一
SHOW VARIABLES LIKE '%storage_engine%'
#方法二
SELECT @@SESSION.default_storage_engine;
1.3修改默认存储引擎
#方法一 修改当前会话层的系统变量
SET SESSION default_storage_engine = '存储引擎';
#方法二 修改my.cnf配置文件
[mysqld]
default_storage_engine = 存储引擎;
1.4创建表时指定对应的存储引擎
CREATE TABLE IF NOT EXISTS table_name (
field_name data_type constraint,
field_name data_type constraint,
field_name data_type constraint
)engine = '存储引擎';
#如果没有指明存储引擎则采用默认存储引擎Innodb
1.5修改表的存储引擎
ALTER TABLE table_name engine = '存储引擎';
2.存储引擎的介绍
2.1什么是存储引擎
存储引擎可以理解为是一个表的类型,即好像变量有对应的数据类型一样,表也有对应的类型,就是存储引擎
存储引擎决定了表如何去处理数据
- 注意: 以上两点都是基于存储引擎决定了底层的索引,而索引对应着不同的数据结构
2.2Innodb存储引擎
-
自MySQL5.5之后,默认存储引擎被改为
Innodb
,在之前的默认存储引擎都是MYISAM
无特殊情况,优先使用Innodb
-
Innodb
是支持事务的,即Innodb
支持回滚操作\ -
Innodb
是支持外键约束的 -
常见的
DML操作
如SELECT UPDATE DELETE INSERT
都应该使用Innodb
这个存储引擎- 使用该引擎的原因主要的原因是
MySQL
对Innodb
做出了优化,效率较高 - 底层索引
MYISAM
对应的非聚簇索引理论上效率更高 以后阐述
- 使用该引擎的原因主要的原因是
-
文件目录
MySQL8.0
.ibd
表结构 + 表数据/索引(数据即索引,索引及数据)
MySQL5.7
.opt
数据库信息.frm
:表结构.ibd
:表数据/索引(数据即索引,索引即数据)
2.3MYISAM存储引擎
MYISAM
既不支持外键约束也不支持事务MYISAM
最大的优势是查询效率高,也是和非聚簇索引有关- 文件目录
MYSQL8.0
.MYD
存储数据.MYI
存储索引.sdi
表结构
MySQL5.7
.MYD
存储数据.MYI
存储索引.frm
表结构.opt
数据库信息
2.4Innodb和MYISAM的区别
对比项 | MYISAM |
InnoDb |
说明 |
---|---|---|---|
外键 | 不支持 | 支持 | |
事务 | 不支持 | 支持 | |
行表锁 | 表级锁 | 行级锁 | 以Java为例,类似于synchronized 的作用 |
缓存 | 只缓存索引,不缓存数据 | 数据和索引一起缓存 | 该原因也是和底层是否为聚簇索引导致的,所以,InnoDb对缓存的要求更高,一定程度上应i选哪个了性能 |
自带系统表使用 | Y | N | |
关注点 | 节省资源,消耗少,简单业务 | 高并发,事务,数据量大 | |
默认安装 | Y | Y | |
默认使用 | N | Y |
2.5Archive存储引擎
Archive
叫做归档,顾名思义其主要作用是对数据进行归档处理,即数据存档
- 因为
Archive
的主要作用是归档,其支持的DML操作
只有SELECT & INSERT
操作- 其中
SELECT
的效率比较低,INSERT
的效率极高
- 其中
2.6Blackhole存储引擎
- 在
Blackhole
存储引擎中,INSERT
操作不被允许,SELECT
操作返回的是NULL
- 所以
DML
最核心的查询和插入操作都是无效的,该存储引擎没有意义
2.7CSV存储引擎
CSV
存储引擎最大的亮点就是其生成如下的文件目录.CSV
该文件存放的是表中的数据,该文件可以被其他软件打开,如Excel
等.CSM
该文件存放的是表的状态
CSV
最大的作用就是让数据库的表可视化,可以用其他软件直接打开,类似于JSON
和XML
2.8Memory存储引擎
Memory
存储引擎最大的亮点是,其他存储引擎存储的数据都在磁盘中,而Memory
的数据存储在内存当中- 故
memory
下的文件目录结构中,在mysq5.7
只有.frm
文件,在mysql8.0
没有任何文件
- 故
- 因为数据存储在内存当中
- 响应速度非常的快,查询效率非常的高
底层是哈希索引,查询元素的时间复杂度是O(1),即使是B+Tree对应的聚簇索引也是O(log2N)
- 数据易丢失,生命周期短
一旦mysql服务被终止,或者是重启,对应的内存都会消失
- 响应速度非常的快,查询效率非常的高
Memory
数据文件和索引文件分开存储,因为其底层并不是聚簇索引
Memory
的大小是有限的,主要取决于max_rows
和max_heap_table_size
max_rows
在创建表时可以指定max_heap_table_size
默认是16mb
,可以按需增大- 上面两者类似于自变量和因变量的关系
Memory
的使用场景- 数据是临时的,而且必须立即使用的,而且这个数据是否被丢弃也无所谓的
- 数据量比较小,而且要被频繁的使用
- 其实这句话也不准确,对于底层的
哈希索引
不适合做一些排序,查找范围值
的操作
- 其实这句话也不准确,对于底层的
类似于自变量和因变量的关系
Memory
的使用场景- 数据是临时的,而且必须立即使用的,而且这个数据是否被丢弃也无所谓的
- 数据量比较小,而且要被频繁的使用
- 其实这句话也不准确,对于底层的
哈希索引
不适合做一些排序,查找范围值
的操作
- 其实这句话也不准确,对于底层的