持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天
回到世界最开始的样子,计算机最基本的资源分配单位为进程,有进程才有资源,有资源才有万物
原初
实际上MySQL一直是芸芸众生中的普通一员,虽说有两个部分
- 服务端(起在服务器上
- 客户端
但实际上也是使用普普通通的进程罢了
对于服务端,一个进程实际上就是一个实例
服务端
任何生物之间都不进相同,虽然他们可能有相同的起源
服务端的进程们也有着不同的形态(来自于不同的启动方式
- mysqld命令,创建最原始的形态(最原始的进程
- mysqld_safe命令,为了保护脆弱的原始形态,同时创建了守护者(监控进程)
-
- 守护者记录着原始形态的出错信息,在其崩溃时进行重新创建(重启
- mysql.server命令,集成了各种形态,只需要使用最简单的命令参数即可实现成熟形态的创建
-
- start,启动服务器进程
- stop,停止
- mysqld_multi命令,多实例运行命令
客户端
相比服务端的各种形态,客户端往往只需要简单的命令就可以连接服务器
- mysql命令
连接
- 客户端与服务端本质实际上都是进程
- 客户端只有连接上服务端才能进行数据库操作
由上面两条可得,实际上也是进程之间的通行
可以通过启动参数的方式指定采用哪种通信方式
- socket
-
- 同域socket(Unix域套接字
-
- 客户端、服务端都在同一台Unix主机上
- 创建socket的时候需指定主机名为localhost
- 默认监听/tmp/mysql.sock文件,可手动更改
- TCP/IP,通过网络的方式建立TCP连接,用于不同主机间通信
-
- 服务端默认使用3306端口监听
- 命名管道
- 共享内存
-
- 客户端与服务端必须在同一台windows主机上
运转
实际上就是客户端、服务端之间通过文本的方式传递命令与执行结果
服务端整个过程为:
- 连接管理
-
- 处理连接
- 解析与优化
-
- 查询缓存
- 语法解析
- 查询优化
- 存储引擎
连接管理
服务端针对每个客户端的连接,会新建线程处理
- 客户端退出后,会将该线程缓存,用于后续客户端连接
- 有线程池缓存的大小限制
连接建立时需要验证信息
- 主机信息、用户名、密码
- 可以使用SSL进行通信(更加安全)
解析与优化
查询缓存
命中缓存的条件:
- 命令完全一样(包括空格注释)
- 没有使用某些系统函数、自定义变量及函数、一些系统表
缓存失效条件:
- 该命令相关的表被更新(insert、update、delete、truncate table、alter table、drop table、drop database)
语法解析
分词、语法解析、构建AST
查询优化
MySQL本身会对查询SQL进行优化,以获得更好的执行效率
如:更换位置以使用缓存等
生成执行计划
可以通过explain命令查看执行计划、效率、使用到的索引等
存储引擎
存储引擎决定了怎么写入、读取数据到物理存储
常见的存储引擎:
- InnoDB:支持外键、事务
- MEMORY:内存数据库
- MyISAM:非事务存储引擎
- ARCHIVE:用于数据存档,只可新增数据
- NDB:MySQL集群专用存储引擎
这里先不展开
关于字符集:
- 数据库存储字符格式
- 数据库字符比较规则
-
- utf8_general_ci会忽略字符大小写
- 用于比较以及排序
- 客户端域服务器通信时,字符集需要一致