目 录CONTENT

文章目录

重新认识MySQL

FatFish1
2025-04-22 / 0 评论 / 0 点赞 / 30 阅读 / 0 字 / 正在检测是否收录...

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,读取数据返回结果

0

评论区