一、连接 MySQL
1、客户端(PHP、Java、Pyhton、C++、Navicat 等)连接MySQL 都是通过MySQL 提供的api 。
2、客户端会携带参数请求 MySQL 提供的api
3、MySQL api(对外连接通道)会进行权限校验和安全校验
4、校验通过后,会在MySQL连接池 创建连接(长连接、短链接)。
注:有几个程序在连接,连接池内就会创建多少个线程,另外值得注意的是,MySQL 是有一个最大连接数限制的,当然该参数是可以设置的。
SHOW VARIABLES LIKE'%max_conn%';
可以通过命令 SHOW FULL PROCESSLIST; 查看当前连接池内的所有连接
注:如果连接数已经达到设置的最大连接数设置,MySQL 会主动销毁掉状态为 sleep 的连接。
二、连接之后的大概流程
5、分析器
对查询语句进行语法分析和词法分析,判断 SQL 语法是否正确,如果查询语法错误会直接返回给客户端错误信息,如果语法正确则进入优化器
6、优化器
对查询语句进行优化处理,例如一个表里面有多个索引,优化器会判别哪个索引性能更好。
注:在这一步,会对每一个已经创建的索引进行分析,这也是如果一个表创建的索引过多也不好的原因。
7、执行器
8、返回结果
注:如果开启了查询缓存,则在分析器之前还有一步验证查询缓存的操作,如果查询缓存有数据,则直接返回。但是目前查询缓存已经基本没人用了,缓存一般都用 Redis 了。
三、MySQL 的日志文件
1、错误日志
服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、
服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的-信息
# 查看错误日志的设置
showglobalvariables like'%log_error%';
2、二进制日志(binlog)
二进制日志,也就是我们常说的binlog。
二进制日志记录了MySQL所有修改数据库的操作,然后以二进制的形式记录日志在日志文件中,其中还包括每条语句所执行的时间和消耗的资源,以及相关的事务信息。
# 查看二进制日志的相关设置
showglobalvariables like'%log_bin%';
(3)事务日志【indodb引擎独有】
redo.log (重做日志,ib_logfile0):重做的不是事务,而是事务执行之后的数据提交
undo.log(回滚日志 ibdata1):回滚执行失败的事务,或回滚执行事务过程中,还没有提交,MySQL就挂掉的情况
(4)慢查询日志(Slow Query Log)
顾名思义,慢查询日志中记录的是执行时间较长的query,也就是我们常说的slowquery。
(5)查询日志( Query Log,一般不用,了解就好)
记录所有的查询sql
四、MySQL 的数据文件
MySQL数据库会在data目录下面建立一个以数据库名为名称的文件夹,用来存储数据库中的表文件数据。
不同的存储引擎,表的文件扩展名也不一样,例如:MyISAM 存储引擎用“.MYD”作为扩展名,Innodb 存储引擎用“.ibd”,Archive 用“.arc”,CSV 用“.csv
注:有一个特殊的文件扩展名,叫做.frm,该文件使用任何存储引擎都会有它,它记录的是数据表结构。
1、Myisam
.myd:存储myisam 表的表数据
.myi:存储myisam 表的索引数据
2、innodb
.ibd:存储innodb表的数据+索引(独享空间,默认就是独享空间)
ibdata:存储innodb表的数据(当设置为共享空间时,数据和索引会记录在这里)
五、事务的执行流程1、开启事务2、写日志文件(重做日志和回滚操作)
重做日志:记录的就是执行的sql
回滚日志:记录的是与执行的sql完全相反的sql
3、提交事务
4、写日志到重做日志,标识这条事务执行的没有问题,并将数据刷到磁盘中