1.Mysql体系结构分为三层,如下图所示:
其中客户端就是我们常见的Java应用ODBC,JDBC等等。
服务层是关键所在,这里面包含了连接管理器、查询缓存、查询解析、查询优化器,也是Mysql中最复杂的所在。查询解析器的作用是是对输入的SQL语句进行解析,如进行语法检查,语义检查,数据访问权限检查等。SQL优化器的做用则是跟据统计信息生成最优的执行计划。
那么存储引擎是干嘛的呢?这里举一个例子,比如我们使用select语句做查询,mysql服务层让存储引擎层知道我们要查询的数据,但是具体的实现方式就是由存储引擎来搞定。
2.MyISAM
MyISAM是5.5之前版本默认的存储引擎,现在的Mysql中呢,一些系统表还有临时表也在使用这个存储引擎,这里的临时表不是指CREATETEMPORARY所得到的表,而是说在排序、分组等操作中,当数量超过一定的大小之后,由查询优化器建立的临时表。
由MyISAM存储引擎由MYD和MYI组成。如下图所示:
创建一个表后,我们看到磁盘里面有frm,MYD,MYI,如下图所示:
其中frm是记录表结构的,所有存储引擎都有的文件
2.1MyISAM特性
- MyISAM提供的是表级锁,读取的时候需要加共享锁。在某些条件下,进行读取的时候可以在表的末尾添加数据。
- 表损坏修复。在创建表的时候我已经把check和repair命令贴出来了,大家可以看一看。
- 支持全文索引。这里推荐一篇文章https://blog.csdn.net/mrzhouxiaofei/article/details/79940958
-
支持数据压缩:myisampack,压缩后就不能在写入数据了。
2.2适合的场景
- 适合非事务应用。比如数据仓库,不涉及财务的应用,是可以不需要事务的
- 适合只读类应用
- 适合空间类应用(GPS)
3.Innodb
Innodb使用表空间进行数据存储,数据存储的位置有innodb_file_per_table这个参数决定,如果这个值为ON,那么存在于独立的表空间:tablename.ibd,如果为OFF,则存在系统表空间中:ibdataX,其中X表示从1开始的数字。
show variables like 'innodb_file_per_table';可以查看这个值的情况。如果要改变这个值可以用set global innodb_file_per_table=off;
那么系统表空间和独立表空间要如何选择呢?
1.系统表空间无法简单的收缩文件大小。就算我们把表中的数据删除了,这个文件的大小也不会改变的。但是如果使用独立表空间可以通过optimize table命令收缩系统文件。
2.系统表空间会产生IO瓶颈,因为只有一个文件,对多个表进行数据刷新时,在文件层面上来说是顺序进行的。独立表空间可以同时向多个文件刷新数据。
所以综上所述我们选择独立表空间。
如果进行系统表空间的数据转移呢?
1.使用mysqldump到处所有数据库表数据
2.停止Mysql服务,修改innodb_file_per_table参数,并删除Innodb相关文件
3.重启Mysql服务,重建Innodb系统表空间
4.重新导入数据
3.1Innodb存储引擎特性
3.1.1Innodb是一种事务性存储引擎,完全支持事务的ACID特性。
为了保证事务的ACD,Innodb提供了RedoLog和UndoLog两个日志文件。
RedoLog是为了实现事务的持久性,它里面存储的都是已经提交的事务,且是顺序写入的,由两部分组成,一部分是内存中的重做日志缓冲区,缓冲区的大小是由innodb_log_buffer_size决定的,show variables like 'innodb_log_buffer_size'可以看到具体的值。缓冲区中的内容是1秒钟可以刷新到磁盘中,所以这个大小不必太大,另一部分是重做日志文件,也就是ib_logfile文件,文件的个数由innodb_log_files_in_group来决定。
UndoLog是帮助未提交事务的回滚以及MVCC。
3.1.2Innodb支持行级锁
隔离性由锁来实现
关于redoLog和UndoLog的一些知识可以推荐大家看https://zhuanlan.zhihu.com/p/63377684