数据库存储引擎
- 网络连接层
- 数据库服务层
服务层是数据库的核心,查询解析,SQL执行计划优化,查询缓存。以及跨存储引擎的功能都在这一层实现:存储过程、触发器、试图等。内部结构如下:
-
存储引擎层
负责MySql中数据的存储于提取。服务器中的查询执行引擎通过API与存储引擎进行通信,通过接口屏蔽了不同存储引擎之间的差异。MySql采用插件式的存储引擎。 -
系统文件层
什么是锁
锁主要作用是管理共享资源的并发访问,用于实现事务的隔离性
锁的类型
共享锁(读锁),针对同一份数据,多个读写操作可以同时进行而不相互影响
独占锁(写锁),当前写操作没有完成之前,它会阻断其他写锁和读锁
MyISAM
MySql 5.5之前的版本默认存储引擎,MyISAM存储引擎表由MYD(数据文件)和MYI(索引文件)组成。frm是存储数据表结构的文件,其他引擎创建的文件也带有.frm文件。
锁的粒度
表级锁 & 行级锁
MyISAM特性
- 只支持表所,并发写入失效率很低
- 不支持事务
- 基于非聚簇索引进行存储的
- 可以压缩,压缩后的表不能修改,但节省磁盘空间,提高查询性能
- 全文索引
- 延迟更新索引键,新建索引时,会先将索引存储到内存中,刷新后才会将对应的索引写入
使用场景
非事务型应用&只读类应用
InnoDB
InnoDB使用表空间进行数据存储,支持事务,支持表级锁和行级锁
--查看表空间
show variables like "innodb_file_per_table";
set global innodb_file_per_table=off;
on:就是innodb是采用独立空间表,记录会存在"表名.ibd"里。系统表空间会产生IO瓶颈,因为刷新数据的时候是顺序进行的。
off:采用系统空间表,在数据库外部文件里生成一个"ibdataX"文件,X是数字,该模式下所有使用innodb引擎创建的表都存储在"ibdataX"文件中。独立表空间可以同时向多个表刷新数据。
MyISAM和InnoDB的对比
对比项 | InnoDB | MyISAM |
---|---|---|
主外键 | 支持 | 不支持 |
事务 | 支持 | 不支持 |
行表锁 | 行锁,适合高并发 | 表锁 |
缓存 | 缓存索引&真实数据,对内存要求高 | 只缓存索引,不缓存真实数据 |
表空间 | 大 | 小 |
关注点 | 性能 | 事务 |
csv引擎
csv已".csv"文件存储表内容,".csm"文件存储表的元数据如表状态和数据量,数据已纯文本方式存储在文件中
注意
- 所有的列不能为NULL
- 不支持索引
- 可对数据直接编辑,编辑后要刷新数据表(flush tables;)才能在数据中显示
使用场景
适合作为数据交换的中间表
引用大佬文章:https://blog.csdn.net/wqq1027/article/details/96987929
Memory引擎
Memory,记忆体,也就是内存
Memory引擎,也称HEAP存储引擎,数据保存在内存中,mysql重启或电脑重启数据会丢失,但表结构会保存下来
特点
- 支持HASH所有和BTree所有
- 所有字段都为固定长度,如果设置了varchar(20),那么char也需要为20
- 不支持BLOB和TEXT等大字段
- 表级锁
总结
大部分情况下,都应该选择Innodb,除非需要用到某些Innodb不具备的特性,并且没有其他办法可以代替,否则都应该优先选择Innodb引擎。
- 如果需要应用事务,那么Innodb(或XtraDB)是目前最稳定且经过验证的选择
- Innodb可以在线热备份
- MyISAM崩溃后发生损坏的概率比Innodb高很多,而且数据恢复(repair table 表名) 速度也比较慢。