MySQL体系结构与存储引擎: 

一、MySQL存储引擎

官方文档: https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html

数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。

MySQL5.7默认存储引擎InnoDB,使用show engines查看数据库可支持的存储引擎。MySQL5.7支持的存储引擎有InnoDB、MyISAM、Memory、Archive、Merge、CSV、BLACKHOLE

1、常用存储引擎的介绍

InnoDB:MySQL 5.7中的默认存储引擎。 InnoDB是用于MySQL的事务安全(兼容ACID)的存储引擎,具有提交,回滚和崩溃恢复功能来保护用户数据。 InnoDB行级锁定(无需升级为更粗粒度的锁定)和Oracle风格的一致非锁定读取可提高多用户并发性和性能。InnoDB将用户数据存储在聚集索引中,以减少基于主键的常见查询的I / O。为了保持数据完整性, InnoDB还支持FOREIGN KEY引用完整性约束。

    参见: https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html

MyISAM:这些表占用的空间很小。 表级锁定 限制了读/写工作负载中的性能,因此它通常用于Web和数据仓库配置中的只读或只读工作负载中。

Memory:将所有数据存储在RAM中,以便在需要快速查找非关键数据的环境中进行快速访问。

CSV:其表实际上是带有逗号分隔值的文本文件。CSV表允许您以CSV格式导入或转储数据,以与读取和写入相同格式的脚本和应用程序交换数据。由于CSV表未建立索引,因此通常InnoDB在正常操作期间将数据保留在表中,并且仅在导入或导出阶段使用CSV表。

2、存储引擎的选择

参见:

mysql数据库默认有哪些库 mysql5.7默认数据库引擎_mysql数据库默认有哪些库

可以根据以下的原则来选择 MySQL 存储引擎:

* 如果要提供提交、回滚和恢复的事务安全(ACID 兼容)能力,并要求实现并发控制,InnoDB 是一个很好的选择。

* 如果数据表主要用来插入和查询记录,则 MyISAM 引擎提供较高的处理效率。

* 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存的 MEMORY 引擎中,MySQL 中使用该引擎作为临时表,存放查询的中间结果。

* 如果只有 INSERT 和 SELECT 操作,可以选择Archive 引擎,Archive 存储引擎支持高并发的插入操作,但是本身并不是事务安全的。Archive 存储引擎非常适合存储归档数据,如记录日志信息可以使用 Archive 引擎。

3、存储引擎的设置

默认存储引擎设置:

    启动命令添加选项 --default-storage-engine=MyISAM,或者在配置文件里添加参数default-storage-engine=MyISAM;

    mysql> SET default_storage_engine=MyISAM;   #临时设置,退出客户端后重新连接就失效。

建表指定存储引擎:

    mysql> create table t1(id int) engine=MyISAM;

    mysql> show create table t1;   #查看建表语句

修改已建表存储引擎:

    mysql> alter table t1 engine=InnoDB;

    mysql> show table status\G;   #查看所有表的情况

    mysql> show engine InnoDB status\G;  #查看某个存储引擎的情况

二、MySQL数据文件

参见:    

在MySQL中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以数据库名字命名的文件夹,用来存放该数据库中各种表数据文件。不同的MySQL存储引擎有各自不同的数据文件,存放位置也有区别。

多数存储引擎的数据文件都存放在和MyISAM数据文件位置相同的目录下,但是每个数据文件的扩展名却各不一样。如MyISAM用“.MYD”作为扩展名,Innodb用“.ibd”,Archive用“.arc”,CSV用“.csv”,等等。

1、“.frm”文件:与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定义信息等。不论是什么存储引擎,每一个表都会有一个以表名命名的“.frm”文件。所有的“.frm”文件都存放在所属数据库的文件夹下面。

2、“.MYD”文件:“ .MYD”文件是MyISAM存储引擎专用,存放MyISAM表的数据。每一个MyISAM表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起。

3、“.MYI”文件 :“.MYI”文件也是专属于MyISAM存储引擎的,主要存放MyISAM表的索引相关信息。对于MyISAM存储来说,可以被cache的内容主要就是来源于“.MYI”文件中。每一个MyISAM表对应一个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。

4、“.ibd”文件和ibdata文件:这两种文件都是存放Innodb数据的文件,之所以有两种文件来存放Innodb的数据(包括索引),是因为 Innodb 的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据。

5、db.opt 文件:该文件记录这个库的默认使用的字符集和校验规,文件存放在所属数据库的目录下。


MySQL InnoDB存储引擎独立表空间存储方式与共享表空间存储方式

参见: 

    独享表空间存储方式:独享表空间存储方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件,文件存放在和MyISAM数据相同的位置。

    共享表空间存储方式:如果选用共享存储表空间来存放数据,则会使用 ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata文件。ibdata文件可以通过 innodb_data_home_dir 和 innodb_data_file_path 两个参数共同配置组成,innodb_data_home_dir配置数据存放的总目录,而innodb_data_file_path配置每一个文件的名称。当然,也可以不配置 innodb_data_home_dir 而直接在 innodb_data_file_path 参数配置的时候使用绝对路径来完成配置。innodb_data_file_path 中可以一次配置多个 ibdata 文件。文件可以是指定大小,也可以是自动扩展的,但是Innodb限制了仅仅只有最后一个ibdata文件能够配置成自动扩展类型。

当我们需要添加新的ibdata文件的时候,只能添加在innodb_data_file_path配置的最后,而且必须重启MySQL才能完成ibdata的添加工作。

 

注:当使用InnoDB存储引擎,使用独享表空间存储方式,需要在my.cnf里添加配置innodb_file_per_table = 1(默认是开启的)。即使你这样配置了,表数据被存储在他们自己的表空间里,但是共享表空间仍然在存储其它的 InnoDB 内部数据:数据字典(也就是 InnoDB 表的元数据)、变更缓冲、双写缓冲区、撤销日志。也就是ibdata1还是会变大,如果使用不合理,仍然可能出现ibdata1占用很大存储空间的问题。

mysql> show variables like '%per_table%';  #查看是否使用独享表空间存储方式。