++++++++++++++++++++++++++++++++++mysql存储引擎的宏观结构 最直观的存储方式 innodb: ibdata1:系统数据字典信息(统计信息),UNDO(回滚信息)表空间等数据 ib_logfile0 ~ ib_logfileN: REDO日志文件,事务重做日志文件。 ibtmp1: 临时表空间磁盘位置,存储临时表(排序,分组,多表连接,子查询,逻辑备份等) frm:存储表的列信息 ibd:表的数据行和索引 ib_buffer_pool:正常关机,存储缓存区的热数据 不同ibdata1存储数据是不同的 5.5中会存储临时数据+用户数据(数据行+索引) 5.6中还会存储临时数据 5.7系统数据字典信息(统计信息),UNDO(回滚信息)表空间等数据 8.0取消存储数据字典信息,undo也不会记录。 mysql再慢慢瘦身ibdata1共享表空间,把比较重要的数据独立出来。 myisam表结构: myt.frm:数据字典信息(列以及定义属性) myt.MYD:数据行 myt.MYI:索引存储(独立索引存储) 微观结构: 磁盘: 表空间:(段,区,页属于表空间) 起初为了解决存储空间的扩展问题。从mysql5.5开始引入共享表空间 共享表空间:用来存储系统数据,日志,undo,临时表,用户数据索引等 需要将所有数据存储到同一个表空间中 ,管理比较混乱 5.5版本出现的管理模式,也是默认的管理模式。 5.6版本以,共享表空间保留,只用来存储:数据字典信息,undo,临时表。 5.7 版本,临时表被独立出来了 8.0版本,undo也被独立出去了 共享表空间设置: 共享表空间设置(在搭建MySQL时,初始化数据之前设置到参数文件中) select @@innodb_data_file_path; show variables like '%extend%'; 方法1:在初始化时my.cnf中增加以下参数,大小可以指定: innodb_data_file_path=ibdata1:512M;ibdata2:512M:autoextend 方法2,在以运行数据库添加扩展多个ibdata文件 innodb_data_file_path=ibdata1:512M(这里要与已经生成的ibdata1大小一致);ibdata2:512M:autoextend #innodb_autoextend_increment=64 独立表空间: 从5.6,默认表空间不再使用共享表空间,替换为独立表空间。单表单空间。 主要存储的是用户数据 存储特点为:一个表一个ibd文件,存储数据行和索引信息 基本表结构元数据存储: xxx.frm 最终结论: 元数据 数据行+索引 mysql表数据 =(ibdataX+frm)+ibd(段、区、页) DDL DML+DQL 普通表空间:完全和oracle一致的表空间管理模式(用的较少) undo表空间:存储回滚日志 临时表空间:存储临时表,5.7默认独立 管理: 用户数(自建表数据)默认存储方式,独立表空间模式,独立表空间和共享表空间 模式可以相互切换。 查看默认表空间模式:select @@innodb_file_per_table; 返回1则为独立表空间模式。0代表共享表空间模式。 如何切换: 一般把共享切换为独立 set global innodb_file_per_table=0; 重新登录。 修改完之后只影响新创建的表。 如何扩展共享表空间大小和个数。(在1970行)