1、重新认识MySQL

1、重新认识MySQL

声明:此博客是本人学习《MySQL是怎样运行的:从根儿上理解MySQL》的学习笔记,侵权必删。如果你发现博客中有错误,还请告诉我,我会第一时间修改并给予您诚挚的感谢ღ( ´・ᴗ・` )。


知识扫盲

MySQL服务器进程也被称为**“MySQL数据库实例”,简称"数据库实例"**。

环境变量:

定义:是一系列地址的集合,每个地址之间用“:”连接。

功能:当我们输入一个命令时,如果没有给出命令的绝对地址或相对地址,系统就会从环境变量中包含的地址中一个一个查找,直到找到命令就执行当前目录下的可执行文件,没找到就报错。

意义:对于一些常用的命令,我们可以将其地址添加到环境变量中,这样在使用这个命令时就不需要每次还要加上冗长的地址了。

关于MySQL服务器占用端口

MySQL服务器默认占用3306号端口,如果想要自定义端口号,可以在启动MySQL服务器时添加 -P 选项来明确指定端口号。注意是大写P。比如要在3307端口监听:

mysqld -P3307

关于MySQL客户端需要连接到的端口

如果MySQL服务器监听的不是3306号端口,我们需要使用 -P 来在连接客户端与服务器时声明新的端口号,注意是大写,小写的是密码。比如连接到3307号端口号:

mysql -u root -p -P3307

启动MySQL服务器程序

在类Unix系统中

在类Unix系统中可以用来启动MySQL服务器程序的文件有很多,大多都存储在MySQL目录下的bin文件夹内。比如:

  • 可执行文件:mysqld

这个可执行文件就代表着MySQL服务器程序,直接运行就可以直接启动一个MySQL服务器程序,但是不常用

  • 启动脚本:mysqld_safe

这个脚本间接调用mysqld,顺便还会启动一个监控进程,这个监控进程作用是在服务器进程崩溃时重启它。使用这个启动脚本启动的服务器进程还会将服务器运行的错误信息和诊断日志输出到指定的文件中,方便寻找错误信息进行系统维护。

  • 启动脚本:mysql.server

这个脚本间接调用mysqld_safe,这个脚本文件是一个链接文件,其源地址是在../support-files/mysql.server。使用这个脚本可以启动、停止服务器进程:

mysql.server start -- 启动服务器进程

mysql.server stop  -- 停止服务器进程
  • 可执行文件:mysqld_multi

这个文件对每一个服务器进程的启动和停止进行监控。

在Windows系统中

在Windows系统中提供了手动启动和服务启动两种方式。

手动启动

MySQL服务器的安装目录中,有mysqld.exe可执行文件,直接双击就可以启动一个服务器程序。

服务启动

先来看看什么是服务

在Windows操作系统中,无论用哪一个用户登录,都要启动并长时间运行某一个程序,我们通常把这个程序注册为一个服务。

服务是由操作系统管理的。

将某个程序注册为服务的代码是:

"完整的可执行文件路径" --install [-manual] [服务名]

# 其中,-manual选项可以不要,若加上这个选项,表示在系统启动时*不*启动这个服务
# 如果不提供服务名,默认为 MySQL

注册为服务之后,执行如下代码来启动或停止一个服务器进程:

net start MySQL -- 启动服务器进程,默认服务进程为 MySQL

net stop MySQL  -- 停止服务器进程

启动MySQL客户端程序

客户端程序也存储在bin目录下,MySQL提供了很多客户端程序,比如 mysqladminmysqldumpmysqlcheck 等。我们重点关注mysql这个可执行文件,我们可以通过这个可执行文件与服务器通信,也就是发送请求和接收响应。mysql可执行文件启动的参数为:

mysql -h 主机名 -u 用户名 -p密码

# 其中,如果服务器和待启动的客户端在一个主机上,-h 选项可以不填,或者写为 localhost 或 127.0.0.0
# 如果不写用户名,默认使用登录操作系统的用户名进行登录。在Windows 系统中,默认用户名为ODBC,可以修改
# 如果要在此命令中输入密码,-p和密码之间不能有空格。比如密码为1234,只能写成 -p1234,写成 -p 1234是错误的

客户端与服务器连接的过程

客户端与服务器的连接,本质上就是进程间的通信,可以通过以下四种方法进行:

  1. TCP/IP协议
  2. 命名管道
  3. 共享内存
  4. Unix域套接字

服务器处理客户端的请求

从两者建立连接,到客户端发送请求,再到服务器处理请求并返回处理结果的过程中,服务器主要做这样的工作:

  1. 连接管理
  2. 解析与优化
    1. 查询缓存
    2. 语法解析
    3. 查询优化
  3. 存储引擎

各部分关系如下图:

在这里插入图片描述

下面对这几个方面的具体细节进行讨论:

连接管理

我们可以用TCP/IP协议、命名管道、共享内存、Unix域套接字中的任意一种来进行C/S连接。

建立连接过程

对于连接管理,和一般的服务器管理连接的方式差不多。当有客户端发起连接请求时,服务器进程就会分配一个线程来处理这个请求;

与一般服务器可能不同的是,当该线程处理完客户端请求时,线程不会被释放,而是会存储起来待下次继续使用,类似于线程池的操作,这样就减少了每次有客户端连接都要创建线程的性能损失。

安全管理

当然,对于客户端的连接请求,服务器是需要进行认证的。客户端发送连接请求时会附带用户名、密码、权限等认证必要信息,服务器对其进行认证,如果不通过就拒绝连接。当服务器和客户端不在同一主机时,还可以通过SSL技术来保证数据传输的安全。

解析与优化

通过连接管理,服务器收到的只是客户端发送来的文本信息,包括我们自己编写的SQL语句、启动脚本等,要知道,我们自己编写的语句肯定不是最优的,肯定还需要服务器进行各种各样的优化处理,具体包括:查询缓存、语法解析、查询优化。

查询缓存
功能描述:

当我们执行某个SQL查询语句时,MySQL服务器如果每次都老老实实的扫描涉及的所有数据库、所有表,那效率会很低,那怎么解决呢?没错,利用缓存!

每次执行SQL语句时,会先在缓存中查询,如果查询到和该语句一模一样的语句,就直接返回结果,否则就把这个SQL语句插入缓存

而且,既然缓存时存放在服务器上的,那么对于所有客户端都是可共享的。也就是说,如果客户端A发送了一个SQL语句请求,这个请求被添加到了缓存中,客户端B也发送了同样的SQL语句请求,那么B就可以直接从缓存中返回结果。

何时不会命中缓存?

当两个查询请求有任何字符上的区别,就不命中。比如带小写、空格、注释等。

何时请求语句不会被缓存?

如果查询请求语句中包含了如下信息,就不会被缓存:

1、某些系统函数。主要是那些两次相同的调用得到不同结果的系统函数,如NOW()函数,在不同时间调用就返回不同的结果;

2、用户自定义的变量、函数。自定义的就会很难命中;

3、某些系统表。如mysqlinformation_schemaperformance_schema数据库中的表。

何时删除缓存中的请求语句?

当某数据库、表等有任何修改时,会删除所有与修改库、表相关的缓存。

MySQL8.0之后,查询缓存不再使用。
语法解析

进行词义分析、语法分析等编译操作,把文本信息中的各种信息存储在MySQL服务器内部的数据结构中。

查询优化

由于我们写的SQL语句不高效,服务器会对我们的查询语句进行优化,如外连接转换为内连接、子查询转换为连接等等,优化后会生成一个“执行计划”。可以通过EXPLAIN语句来查看语句的执行计划。

EXPLAIN SELECT
	...
FROM your_table 
WHERE some_column = 'some_value';
存储引擎和MySQL server

为了方便管理,人们把查询缓存、语法解析、查询优化等不涉及具体数据结构的操作划分在MySQL server范畴,而把具体操作表、操作文件的操作封装到存储引擎中。

行计划。

EXPLAIN SELECT
	...
FROM your_table 
WHERE some_column = 'some_value';
存储引擎和MySQL server

为了方便管理,人们把查询缓存、语法解析、查询优化等不涉及具体数据结构的操作划分在MySQL server范畴,而把具体操作表、操作文件的操作封装到存储引擎中。

  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值