不求解决实际问题,只记录探索之路,路漫漫,慢点看,永不停歇
前言:数据库是啥,数据库实例是啥?
数据库:数据库是文件的集合,是按照某种数据模型组织起来并存放于二级存储器中的数据文件的集合。
数据库实例:数据库实例是程序,是位于用户和操作系统之间的一层数据管理软件。用户对数据库的一切操作以及数据库本身的运行都是在数据库实例下运行的,应用程序只有通过数据库实例才能和数据库打交道。
一、前奏
1、配置文件
查看配置文件所在位置(命令):mysql --help | grep my.cnf
显示会在以下位置查找配置文件:
配置文件优先级:当多个配置文件中存在同一配置的时候,取最后一个配置。即:配置的优先级为 /etc/my.cnf -> /etc/mysql/my.cnf -> /usr/local/mysql/etc/my.cnf -> ~/.my.cnf 越往后级别越高,高级别会覆盖低级别的配置内容。
2、MySQL的组成部分(体系结构)
上图来自于MySQL官方手册
①:连接池组件
②:管理服务和工具组件
③:SQL接口组件
④:查询分析器组件
⑤:优化器组件
⑥:缓冲(cache)组件:
⑦:插件式存储引擎:该存储引擎是基于表的。
⑧:物理文件
3、MySQL存储引擎
①:InnoDB :采用B+树实现,支持事务操作,采用更小粒度的行级锁,在5.5.8开始是默认的数据库存储引擎,通过MVCC(多版本并发控制)获得高并发支持,并且实现了SQL标准的4种隔离级别,默认为 REPEATABLE 级别,使用一种叫做 next-key-locking 的策略来避免幻读,采用聚集索引的方式,因此每张表的存储都是按照主键的顺序存放的,如果没有显式指定主键,Innodb 会为每一行记录生成一个6字节的 rowid 作为主键。
②:MyISAM:不支持事务,表级锁,支持全文索引,5.5.8版本之前默认的数据库存储引擎。
③:Memory:数据存储在内存中,一旦服务器重启,数据全部丢失,适合做临时表以及数据仓库中的维度表。
④:Archive:采用 zlib 压缩算法将数据行压缩后存储,压缩比可达到 1:10,但是只支持 select 和 insert 操作,非常适合存储归档数据,例如日志信息,使用行锁来实现高并发的插入操作,但是并不是事务安全型的引擎,其设计目标主要是 提供高速插入和压缩功能。
⑤:其他:CSV,Maria等不做描述
4、存储引擎之间的对比(来自官网):
对比内容包括 容量限制,事务支持,锁的粒度,MVCC支持,支持的索引、备份和恢复等
二、Innodb 存储引擎
1、Innodb 各版本功能对比
2、Innodb 逻辑存储结构
所有数据都被逻辑得存储在一个空间中,这个空间叫做表空间,表空间包括:段(segment)、区(extent)、页(page)有时候也叫块(block)
表空间:
通过启用参数 innodb_file_per_table 可以控制将每张表的数据单独存放在一个表空间中,不启用默认存放共享表空间中。
启用参数 innodb_file_per_table 后每张表的表空间内存放的只是数据、索引、插入缓冲 bitmap 页,其他数据 回滚信息(undo)、插入缓冲索引页、系统事务信息 、二次写缓冲 还是存放在共享表空间里。
段:
常见的段有 数据段、索引段、回滚段等,innodb 存储引擎中数据段为 B+树 的叶子结点,索引段为 B+树的非叶子节点。
区:
由连续的块(页)组成的,任何情况下,区的大小都是 1MB,默认情况下,一个页有16KB,一个区有64个页。
页:
页的大小可以通过参数 innodb_page_size 控制,默认大小为 16KB,可通过参数设置为 4KB,8KB,16KB。