存档点0 Enter the world

76 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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会忽略字符大小写
    • 用于比较以及排序
  • 客户端域服务器通信时,字符集需要一致