MySQL会用到的文件
3.1 参数文件
mysql启动的时候会读取的配置文件,也是之前装Mysql时候需要修改的配置文件,比如修改配置文件允许远程访问。MySQL的配置文件有多个,按照顺序读取,如果有重复的字段设置以最后一个为准。
没有配置文件也是可以启动的,但是是按照编译时候默认的参数来启动的,既然是编译时候默认的那也就不能修改,所以还是得有一个参数文件。
3.1.1 什么是参数
参数就是参数啊……启动的时候的配置,例如缓存池的大小,是否允许非localhost的请求访问数据。可以通过show variables结合like指令搜索查看某个想确定的参数。
3.1.2 参数类型
参数类型分为动态和静态,动态类型的参数在运行期间可以修改,静态参数MySQL启动以后就不能修改。对动态参数的修改又分为两种,一种是session级别一种是global级别,即修改后的结果是只在当前会话生效还是全局都生效。
首先看到当前全局的read_buffer_size的大小。
然后修改了read_buffer_size的大小
但是修改之后查看全局的read_buffer_size的大小并没有改变
改变的是session级别的read_buffer_size
如果想要对全局的动态变量进行修改需要制定@@global参数
3.2 日志文件
3.2.1 错误日志
记录着mysql运行期间所有的错误记录,也包括警告等信息。在show variables里查看错误日志的位置。
3.2.2 慢查询日志
用于sql语句的优化,在执行所有sql语句的时候如果某个sql语句的执行时间大于指定的阈值,就会写入慢查询日志里,通过分析慢查询日志可以找到需要优化的sql语句。
我电脑上是14.14的版本,和书上的版本不一样,相关的变量的名称也不一样。所以我首先检索和slow相关的所有变量,可以看到下面两个个变量是和书上的变量相对应的,是否开启慢查询和慢查询日志的位置。
long_query_time对应着慢查询的阈值。
如果某些查询没有使用索引,那么即使他的查询时间没有超过阈值,但是他仍然有优化的空间,所以也希望把没有使用索引的sql语句放到查询日志里。log_queries_not_using_indexes对应着开启这一功能。
随着MySQL运行时间的增长,慢查询日志的长度也会增加,人肉去看这个日志就会不现实,为此MySQL提供了两种优化方案。
一种是使用mysqldumpslow命令,该命令提供了对慢查询日志的检索功能。
一种是不直接查看慢查询的文本日志,而是查看慢查日志记录的对应的表里。该表存储在mysql.slow_log的位置。
这个太乱了,我还是喜欢直观的。
这个就很不错
但是默认是不写在这个表里的,是写在文件里的。其实不只是慢查询的日志默认写在文件里,所有的日志都是默认写在文件里的,但是可以设置成输出到表里,虽然这样会增加一定的存储开销。通过使用上面提到的set命令,并把作用域设置成global使所有会话的所有日志都输出到表里。
开启慢查询的目的是为了优化sql语句,其中之一的优化方式是分析逻辑读取和物理读取的比例。物理读取是从磁盘读,逻辑读取既包含磁盘也包含缓冲池。
3.2.3 查询日志
所有的sql操作都被记录在这个日志里,无论他是否被正确执行。
首先要找到这个查询日志的文件的位置,书上没有写叫啥,我就暴力的搜索了含log的所有variables。
原来它叫general_log,而且默认是关闭的,先打开。本着节省空间的目的,我决定只在session里打开。
但是他不让,必须是global的
现在在看这个gerenal_log已经打开了
随便查询一个语句,然后vi看一哈。
成了!
3.2.4 二进制日志
记录了所有对数据库进行修改的记录,只包括update delete操作。
3.3 套接字文件
本地连接MySQL可以使用套接字方式,此时需要一个套接字文件。
3.4 pid文件
MySQL启动的时候会把自己的进程ID写到PID文件里
3.5 表结构文件
每个表、视图都有一个以frm结尾的文件来存储该表或者试图的结构
3.6 InnoDB存储引擎文件
3.6.1 表空间文件
3.6.2 重做日志文件
类似于之前的bin日志,每次更新前先写入redo log里,并修改内存里的内容,等到时机合适的时候再把内容更新到磁盘里,这是提高效率的一种方式,同时也是安全性的体现,有了redo log就可以恢复数据库。
redo log是按照组来组织的,至少有一组redo log,一组里至少有两个redo log,每次写的时候先往redo log1里写,写满的时候再去redo log2里写,然后循环使用。当然MySQL会在合适的时候把redo log里的内容刷到磁盘里。
和redo log相关的参数如下
file_size代表日志文件大小。in_group代表有几个日志文件组。home_dir是路径。ahead_size代表向redo log里追加的大小。
这里要注意区别之前的bin log,bin log是server层的日志,在InnoDB引擎被开发出来之前,MySQL只有bin log日志,bin log日志对于所有的引擎都是可以使用的。其次二者存储的内容不同,redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。