mysql存储引擎熟知的主要是myISAM、InnoDB。myISAM和InnoDB到底有什么区别呢,都常说如果项目上使用到事务就用InnoDB,如果对事务无要求就用myISAM,查询速度更快。除了这两个存储引擎还有那些呢,虽然不常用,但是还是要做个了解,万一遇到合适的场景,到时候就没有那么慌啦。这篇内容主在了解,不做详细原理解释。
1. mysql存储引擎
mysql数据的存储引擎是很多的,想查看你使用的数据库有哪些引擎,一个命令可以帮助你。↓↓
show engines;
执行命令后得到的结果如下:
共有9种存储引擎,从这些列出的引擎中,InnoDB是默认的,因为从mysql5.6及以后,mysql数据库默认的引擎就是他。在没有了解这方面的知识之前,只知道有InnoDB和MyISAM,知识匮乏到我自己都发指。
这些引擎的特性就不一一的说,有几个有意思的,有可能被用到的说一下,做个mark,了解一下。
1.1 存储文件
存储引擎各有不同,不同的存储引擎存储数据的方式是不一样的,另外在电脑中形成的文件也是不同的。其中不会变得就是表的结构文件xx.frm,存储的是数据库表的结构。
1.2 CSV
这个存储引擎在存储数据的时候采用的是类似于excel表格的方式,如果接触过财务报表的,可能会知道这个文件,可以直接用excel打开。用excel打开后是可以进行编辑,保存后是可以在数据库中查询的。
在磁盘上的体现是三个文件,分别是xx.csm、xx.csv、xx.frm。
- xx.csm:用来存储表的元数据,如表的状态、数据量等
- xx.frm:用来存储表的结构
- xx.csv:用来存储具体的数据,如上面说的,这个文件就是可以用Excel表格打开,并可以编辑的
特性:
- 以CSV格式进行数据存储
- 所有列都不可以为null
- 不支持索引
- 可以对CSV文件直接编辑
1.3 Memory
看名字就知道,这个存储引擎存储的数据是在内存中实现的,很容易可以想到这个引擎可能会导致内存溢出,也不能保证数据的安全性,当宕机或者重启的时候,数据就会丢失。在磁盘文件上也是有所体现的,只有xx.frm表结构文件,没有存储数据的文件。
特性:
- 又被称为Heap存储引擎,数据存储在内存中
- 支持hash的btree索引
- 所有字段都是固定长度,长度为10,其中varchar和char是等同的
- 不支持text或者blog大字段
- 使用表级锁
此表的数据在内存中,如果是做短期的聚合数据存储是可以的,再者数据容易丢失,不能用于重要的数据存储。
1.4 Federated
这个引擎只会存储数据表结构,不存具体的数据,具体的数据需要通过远程连接其他表得到,只要保证Federated引擎下对应的表结构和远程连接的表结构相同即可。这让我想起了以前东家的数仓(数据仓库),他们可能就是采用远程连接的方式实现,也就是Federated存储引擎。
特点:
- 提供访问远程MySQL服务器上表的方法
- 本地不存储数据,数据全部放在远程MySQL数据服务器中
- 本地存储表结构和远程服务的连接信息
使用方式:
create table `local_user`(
`id` int(11) not null auto_incerment,
`userName` varchar(32) not null default '',
`phone` varchar(11) not null default '',
primary key (`id`)
) engine = fedreated charset=uft8 connection = 'mysql://root:root@127.0.0.1:3306/remote/t_user'
1.5 InnoDB
InnoDB存储引擎是最常用的一种,可以说现在的百分之九十以上的公司,都是使用的这个存储引擎,因为在正常的一个应用服务里面都是需要事务的支持。
特性:
- InnoDB是事务性存储引擎,支持事务,也是MySQL内唯一一个支持事务的存储引擎
- 完全支持事务的ACID特性
- InnoDB支持行锁、页锁和表锁,在使用得当的时候,可以有效的提高数据库的并发程度
在MySQL5.6版本之前,InnoDB默认是采用系统表空间,但是5.6以后就默认采用了独立表空间。
系统表空间:一个MySQL数据库中,存储的数据都是放在一个系统级的文件中,也就是所有表的数据都存储在同一个文件中。
独立表空间:每个表的数据对应一个数据文件,互不干扰。
独立表空间和系统表空间的比较:
- 系统表空间无法简单的收缩文件的大小
- 独立表空间可以通过
optimize table
收缩文件 - 系统表空间会产生IO瓶颈,在数据量大的时候,读取效率较独立表空间慢
- 独立表空间可以同时向多个文件刷新数据,因为每个表对应的存储文件是独立的
1.6 MyISAM
此存储引擎只支持表锁,表锁对应的有写锁(独占锁)和读锁(共享锁),如果表的数据被频繁的修改,这样就会导致数据库的读写操作效率变低。因此MyISAM用在只读数据库来说是更有优势的。
特性:
- 并发锁级别-表级锁
- 支持全文检索
- 不支持事务
- 支持数据压缩
1.7 MyISAM和InnoDB的比较
MyISAM和InnoDB是mysql数据库中最常用的两个引擎,下面比较一下两个引擎的区别。
对比项 | MyISAM | InnoDB |
---|---|---|
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁 不适合高并发的读写操作 |
行锁 适合高并发操作 同时也支持表锁和页锁 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引,还要缓存真实数据,对内存要求高 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
默认安装 | Y | Y |
2. 总结
对于数据库的了解知识存储引擎是完全不够的。比如InnoDB的事务特性、隔离级别是怎么实现的,如行锁、表锁、独占锁、共享锁都是怎么一个工作机制,如悲观锁和乐观锁有什么区别,如行锁在什么情况下会失效升级为表锁,如数据库索引的Hash和Btree是怎么实现的,如聚集索引和非聚集索引又是怎么个情况,等等。都是工作中必须了解的东西。期待后期更新吧,我们一起学习。