文章摘要(AI生成)
文件结构是指MySQL存储目录中包含的不同部分,包括日志、https认证、表空间和数据文件、InnoDB重做日志以及缓冲池。
其中,日志文件主要用于记录数据库的操作信息和错误信息,包括错误日志、二进制日志、查询日志、慢查询日志和事务redo日志等。错误日志记录运行过程中遇到的严重错误信息和启动关闭信息,二进制日志记录数据库的DDL和非SELECT的DML语句以及执行时间,通常用于主从复制和数据备份恢复。查询日志可记录用户的所有操作,但在高并发环境中会产生不必要的磁盘IO,建议非调试场景不开启。慢查询日志记录执行时间超过阈值的查询语句。
表空间和数据文件是MySQL中存储表数据和索引的地方。系统表空间是被多个表共享的,包含InnoDB数据字典、double write buffer、changebuffer、undo logs的存储区域,以及用户在系统表空间创建的表数据和索引数据。用户表空间只存储用户定义数据表的数据和索引信息,其余信息存放在系统表空间中。数据文件是InnoDB和MyISAM常用的引擎,用于存储实际的数据。
总之,MySQL的文件结构包括日志、https认证、表空间和数据文件、InnoDB重做日志以及缓冲池。这些文件用于记录数据库操作信息、存储表数据和索引,并对数据库的性能和数据恢复起到重要作用。
文件结构
我们随即打开一个mysql存储目录,其文件结构如下:
整个文件结构有5个部分:mysql日志、https认证、表空间和数据文件、InnoDB重做日志以及缓冲池。
日志文件
主要记录了数据库的操作信息和错误信息,包括错误日志、二进制日志、查询日志、慢查询日志和事务redo日志等。
错误日志(error log):默认开启,(5.5.7之后无法关闭)记录运行过程中遇到的所有严重错误信息,以及启动和关闭信息。
二进制日志(bin log):默认关闭。可以通过设置log-bin=mysql-bin
开启。binlog记录了数据库所有的ddl和除了select语句的dml语句。以及每条居于的执行时间信息。如果是ddl则直接记录,如果是dml则在事务提交后才记录。主要用于主从复制、数据备份、数据恢复
通用查询日志(general query log):默认关闭。可以通过general_log=ON
开启。会记录用户的所有操作,还包含增删改查等信息,在高并发的环境中会产生不必要的磁盘io,影响mysql性能。建议非调试场景不开启。
慢查询日志(slow query log):默认关闭,需要通过以下配置开启:
# 开启慢查询日志
slow_query_log=1
# 设置慢查询路径
slow-query-log-file=/www/server/data/mysql-slow.log
# 设置阈值,单位是秒
long_query_time=3
通过慢查询日志我们可以排查到用户使用数据库的慢查情况:
表空间和数据文件
表空间
系统表空间是一个共享的表空间,因为它是被多个表共享的。InnoDB系统表空间包含InnoDB数据字典(元数据以及相关对象)、double write buffer、changebuffer、undo logs的存储区域。系统表空间也默认包含任何用户在系统表空间创建的表数据和索引数据
系统表空间是由一个或者多个数据文件组成。默认情况下,一个初始大小为10MB,名为ibdata1的系统数据文件在MySQL的data目录下被创建。用户可以使用innodb_data_file_path 对数据文件的大小和数量进行配置。
用户表空间只存储用户定义数据表的数据、索引信息,其余信息还是存放在默认的系统表空间中。
数据文件
由于数据库常用引擎为InnoDB和MyISAM,所以以此为例。
- InnoDB数据文件:
.frm
文件:用于存放与表相关的数据信息,主要为表结构的定义信息.idb
文件:使用独享表空间存储表数据和索引信息,一张表对应一个idb
文件ibdata
文件:使用共享表空间存储表数据和索引信息,所有表共同使用一个或多个ibdata
文件
- MyIsam数据文件:
.frm
文件:同样用于存放表结构的定义信息.myd
文件:主要用来存储表数据信息.myi
文件:主要用来存储表数据文件中任何索引的数据树
InnoDB独享表空间存储:
MyIsam数据文件存储示例:
重做日志文件
默认情况下,在innoDB存储引擎的数据目录下会有两个名为ib_logfile0
和ib_logfile1
的文件,这就是InnoDB的重做日志文件(redo log file),它记录了对于InnoDB存储引擎的事务日志。
重做日志文件的作用:
-
当lnnoDB的数据存储文件发生错误时,重做日志文件就能派上用场。InnoDB存储引擎可以使用重做日志文件将数据恢复为正确状态,以此来保证数据的正确性和完整性。
-
为了得到更高的可靠性,用户可以设置多个镜像日志组,将不同的文件组放在不同的磁盘上,以此来提高重做日志的高可用性。
重做日志文件组是的写入:
- 每个InnoDB存储引擎至少有1个重做日志文件组(group),每个文件组下至少有2个重做日志文件,如默认的
ib_logfile0
和ib_logfile1
. - 在日志组中每个重做日志文件的大小一致,并以循环写入的方式运行lnnoDB存储引擎先写入重做日志文件1,当文件被写满时,会切换到重做日志文件2,再当重做日志文件2也被写满时,再切换到重做日志文件1。
设置重做日志文件大小:
- 可以使用
innodb_log_file_size
来设置重做日志文件的大小,这对innDB存储引擎的性能有着非常大的影响。 - 如果重做日志文件设置的太大,数据丢失时,恢复时可能需要很长的时间:
- 另一方面,如果设置的大小,重做日志文件太小会导致依据checkpoint的检查需要频繁剧新脏页到磁盘中,导致性能的抖动。
缓冲池
InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。但是由于CPU速度和磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池记录来提高数据库的的整体性能。缓冲池中缓存的数据页类型有:索引页、数据页、undo页、插入缓冲(insert buffer)、 自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息(lock info)和数据字典信息(data dictionary)。
逻辑结构
MySQL逻辑结构如下所示:
大体来说,MySQL可以分为 Server层和存储引擎层两部分。 Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。
连接器
连接器负责跟客户端建立连接、获取权限、维持和管理连接。当客户端使用用户和密码登录mysql时,连接器负责查看响应用户是否有权限,如有则建立连接。建立连接后,若长时间未使用,连接器则会在超过wait_timeout
的等待时间时将其关闭。
数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指 每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。而连接创建复杂,耗时较长所以应尽量使用长连接,过多的的长连接又会占用很大内存可能导致mysql异常重启。所以应该采取以下方式连接数据库:
- 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接之后要查询再重连。
- 如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行
mysql_reset_connection
来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态
查询缓存
mysql中默认缓存是关闭的,在8.0中甚至移除掉了查询缓存。不开启查询缓存的原因是由于缓存失效频繁,表的一次更新会导致所有相关缓存被清空。写入压力大的数据库来说,缓存命中率会非常低。我们可以设置query_cache_type
来觉得是否开启缓存查询:
值为0或OFF会禁止使用缓存。
值为1或ON将启用缓存,但以 SELECT SQL_NO_CACHE 开头的语句除外。
值为2或DEMAND时,只缓存以 SELECT SQL_CACHE 开头的语句。
解析器
sql解析器会对我们输入的sql进行词法解析和语法解析,把相应的sql语句转换为一颗语法解析树
优化器
优化器可以根据解析树生成不同的执行计划,然后选择一种最优的执行计划,MySQL里面使用的是基于成本模型的优化器,哪种执行计划执行时成本最小就用哪种。
通常会从以下维度做优化处理:
- 当有多个索引可用的时候,决定使用哪个索引;
- 在一个语句有多表关联(join)的时候,决定各个表的连接顺序,以哪个表为基准表。
执行器
执行器首先会对目标表进行权限校验,如果有权限,就使用指定的存储引擎打开表开始查询。执行器会根据表的引擎定义,去使用这个引擎提供的查询接口,提取数据。
评论区