MySQL的架构
MySQL的CS架构
MySQL是客户端-服务器模式:
客户端比如navicat,就是我们的连接,我们提交增删改查请求就是通过客户端提交;
服务器则直接和存储的真实数据打交道,处理我们的增删改查请求
一般情况下,服务端的进程默认名称为mysqld,客户端进程默认名称为mysql
MySQL安装文件结构
bin目录下的可执行文件
├── mysql
├── mysql.server -> ../support-files/mysql.server
├── mysqladmin
├── mysqlbinlog
├── mysqlcheck
├── mysqld
├── mysqld_multi
├── mysqld_safe
├── mysqldump
├── mysqlimport
├── mysqlpump
... (省略其他文件)
在linux环境下,可以通过例如./bin/mysqld
启动这些文件,或者把mysql/bin
目录添加到环境变量并直接执行(环境变量 PATH 的值表明:当我在输入一个命令时,系统便会在环境变量的目录下依次寻找是否存在我们输入 的那个命令,如果寻找成功,则执行该目录下对应的可执行文件)
回到这些文件,其作用包括:
服务端文件
mysqld:启动mysql服务端进程
mysql_safe:调用mysqld,除了启动服务端进程外,还启动一个监控进程,输出错误日志
mysql.server:调用mysql_safe,可以是最常用的启动程序,包括mysql服务端启停命令:
mysql.server start
mysql.server stop
mysql_multi:启动mysql多服务端进程
客户端文件
mysql:启动客户端进程,常用的命令包括:
mysql -h <ip> -P <port> -u <user> -p
需要注意的是:
端口
-P
可以不指定,因为mysql默认3306。如果想要mysql监听其他端口,则需要显式指定,例如mysqld -P 3307
,同时客户端也需要指定端口访问,例如mysql -h 1277.0.0.1 -P 3307 -u root -p
-p
指定密码,可以只加-p
,不加明文密码,点击回车就会有专门的输入密码步骤,如果要加密码,必须连起来写,例如:mysql -h 1277.0.0.1 -P 3307 -u root -p123456
,以下写法是错的:mysql -h 1277.0.0.1 -P 3307 -u root -p 123456
MySQL服务端处理客户端请求的流程
大致流程如下:连接管理-解析优化-存储引擎
连接管理
MySQL客户端与服务端建立连接的方式包括tcp/ip(最常用)、命名管道和共享内存(windows)、Unix套接字(unix)
当服务端收到连接请求,会创建一个线程处理该请求,但客户端断开连接的时候,服务端不会立刻销毁这个连接,而是将它缓存起来,在另一个新的客户端再进行连接时,把这个缓存的线程分配给该新客户端。这样就起到了不频 繁创建和销毁线程的效果,从而节省开销
解析与优化
查询缓存
MySQL服务端会将一次查询的请求和结果缓存起来,下次如果有一样的查询请求,第二次查询就可以命中缓存,减少服务器开销
但是以下情况无法命中缓存:
如果两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中
如果查询请求中包含某些系统函数例如
now()
函数计算时间、用户自定义变量和函数、一些系统表,如mysql 、information_schema、 performance_schema数据库中的表,那这个请求就不会被缓存如果查询的表在缓存后又执行了修改操作,例如INSERT 、 UPDATE 、 DELETE 、 TRUNCATE TABLE 、 ALTER TABLE 、 DROP TABLE、DROP DATABASE等,缓存失效并删除
注:MySQL 5.7.20开始不再推荐使用缓存,MySQL 8.0后删除了缓存功能
语法解析
解析查询文本,判断查询语句正确性,提取其中的表、条件,映射到MySQL服务器使用的内部数据结构上
查询优化
MySQL服务器级别的自动优化,,如外连接转换为内连接、表达式简化、子查询转为连接等
这一步的优化不是万能的,命中不了的索引这里再优化还是命中不了,因此还是要以研发时人工优化为主
存储引擎
存储引擎=MySQL存储的数据+数据的提取操作
换句话说,数据的物理存储结构,加上读/写方式封装在一起就是数据存储引擎
常用的存储引擎包括:
ARCHIVE:用于数据存档(行被插入后不能再修改)
BLACKHOLE:丢弃写操作,读操作会返回空内容
CSV:在存储数据时,以逗号分隔各个数据项
FEDERATED:用来访问远程表
InnoDB:具备外键支持功能的事务存储引擎
MEMORY:置于内存的表
MERGE:用来管理多个MyISAM表构成的表集合
MyISAM:主要的非事务处理存储引擎
NDB:MySQL集群专用存储引擎
最常用的例如InnoDB、MyISAM
使用SHOW ENGINE
命令可以查看支持的引擎
使用ENGINE = xx
子句可以设置存储引擎,例如:
CREATE TABLE t_test (
语句;
) ENGINE=InnoDB
也可以使用ALTER语句修改存储引擎,例如:
ALTER TABLE t_test ENGINE = MyISAM
到了存储引擎这一步骤,MySQL服务端就会把解析好的查询任务交给存储引擎,调用存储引擎提供的api,读取数据返回结果
评论区