Mysql 是怎么运行的 - 读书笔记 1
Mysql 的可执行文件
mysqld 代表 mysql 服务器程序
mysqld_safe 是个启动脚本,会调用 mysqld,顺便启动一个监控进程。这样有两点好处:1 服务器挂了可以帮助重启服务器。2 会将错误信息和其他诊断信息重新定向到某个文件。产生出错日志,方便定位错误
mysql.server 也是一个启动脚本,会间接调用 mysqld_safe。
mysqld_multi 运行多个服务器实例时,可以对每个服务器进程的启动和停止进行监控
mysql -h 主机名 -u 用户名 -p 密码
客户端与服务器端都是进程,进程之间的通信。
Mysql 采用的 tcp 作为服务器与客户端之间的网络通信协议。
命名管道和共享内存是 Windows 操作系统中的两种进程间通信方式。
进程之间的通信:
使用
命名管道
进行进程间的通信。需要在服务器启动命令中加上--enable-named-pipe
,在客户端程序的命令中加入--pipe
或者--protocol=pipe
.使用
共享内存
进行进程间的通信。在服务器启动命令中加上--shared-memory
参数。在启动客户端时加上--protocol=memory
。需要注意的是,使用共享内存的方式进行通信的服务器进程和客户端进行必须在一台 windows 主机中。unix 域套接字文件(服务端与客户端在同一台类 unix 机器)。如果在启动客户端时,指定主机名为 localhost,或者指定
--protocol=socket
,MySQL 服务器程序默认监听的 Unix 域套接字文件路径为 /tmp/mysql.sock ,客户端程序也默认连接到这个 Unix 域套接字文件。
其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发 送一段文本(MySQL 语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)
连接管理
每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来专门处理与这个 客户端的交互,当该客户端退出时会与服务器断开连接,服务器并不会立即把与该客户端交互的线程销毁掉,而 是把它缓存起来,在另一个新的客户端再进行连接时,把这个缓存的线程分配给该新客户端。这样就起到了不频 繁创建和销毁线程的效果,从而节省开销。
关于查询缓存(从 mysql5.7.20 开始,不推荐使用查询缓存)
什么情况不会命中缓存
两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中
如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表,如 mysql 、informationschema、 performanceschema 数据库中的表,那这个请求就不会被缓存。
缓存失效:
MySQL 的缓存系统会监测涉及到的每张表,只要该表的结构或者数 据被修改,如对该表使用了 INSERT 、 UPDATE 、 DELETE 、 TRUNCATE TABLE 、 ALTER TABLE 、 DROP TABLE 或 DROP DATABASE 语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除
mysql 启动配置顺序问题
1、 不同文件
配置读取的顺序是,由上到下。如果不存在,就会忽略。如果有重复配置,取最后出现的配置。
2、 同一文件,不同组
同一个命令,可以访问配置文件中的多个组。比如 mysqld 可以访问 [mysqld] 、 [server] 组。如果在同一个配置文件中,两个组内出现了相同的配置,例如
那么将以最后一个出现的组中的启动选项为准。
3、 启动选项既在命令行,又在配置文件中
这种情况,以命令行中的启动选项为准。
查看系统变量
修改系统变量
启动时的两种方式
通过命令行添加启动选项。例如
mysqld --default-storage-engine=MyISAM --max-connections=10
通过配置文件添加启动选项。例如
注意:对于启动选项来说,如果启动选项名由多个单词组成,各个单词之间用短划线
-
或者下划线_
连接起来都可以,但是对应的系统变量之间必须使用下划线_
连接起来。
运行过程中设置
对于大部分系统变量来说,它们的值可以在服务器程序运行过程中进行动态修 改而无需停止并重启服务器。
系统变量的作用范围
:
GLOBAL :全局变量,影响服务器的整体操作。
SESSION :会话变量,影响某个客户端连接的操作。(注: SESSION 有个别名叫 LOCAL )。
语法:
例如(之后新连接到服务器的客户端都用 MyISAM 作为默认的存储引擎)
只想对本客户端生效,则可以:
如果在设置系统变量的语句中省略了作用范围,默认的作用范围就是 SESSION
SHOW VARIABLES
默认看到的是 SESSION 的系统变量
SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];
如果某个客户端改变了某个系统变量在GLOBAL
作用范围的值,并不会影响该系统变量在当前已经连接 的客户端作用范围为SESSION
的值,只会影响后续连入的客户端在作用范围为SESSION
的值。
注意事项
并不是所有系统变量都具有 GLOBAL 和 SESSION 的作用范围。
有一些系统变量只具有 GLOBAL 作用范围,比方说 max_connections ,表示服务器程序支持同时最多有 多少个客户端程序进行连接。
有一些系统变量只具有 SESSION 作用范围,比如 insertid ,表示在对某个包含 AUTOINCREMENT 列的 表进行插入时,该列初始的值。
有一些系统变量的值既具有 GLOBAL 作用范围,也具有 SESSION 作用范围,比如我们前边用到的 defaultstorageengine ,而且其实大部分的系统变量都是这样的
有些系统变量是只读的,并不能设置值。
状态变量
mysql 服务器程序维护了很多关于程序运行状态的变量。被称为状态变量。例如Threads_connected
表示当前有多少客户端与服务器建立了连接。由于 状态变量是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序自己来设置,我们程序员是不能设置的。
查询格式:SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];
查看 Mysql 中支持的比较规则例如`utf8generalci`
命名比较有规律:
比较规则名称以与其关联的字符集的名称开头。如上图的查询结果的比较规则名称都是以 utf8 开头的。
后边紧跟着该比较规则主要作用于哪种语言,比如 utf8polishci 表示以波兰语的规则比较, utf8spanishci 是以西班牙语的规则比较, utf8generalci 是一种通用的比较规则。
名称后缀意味着该比较规则是否区分语言中的重音、大小写啥的,具体可以用的值如下:
比如 utf8generalci 这个比较规则是以 ci 结尾的,说明不区分大小写。
从发送请求到接收结果过程中发生的字符集转换
客户端使用操作系统的字符集编码请求字符串,向服务器发送的是经过编码的一个字节串。
服务器将客户端发送来的字节串采用 charactersetclient 代表的字符集进行解码,将解码后的字符串再按照 charactersetconnection 代表的字符集进行编码。
如果 charactersetconnection 代表的字符集和具体操作的列使用的字符集一致,则直接进行相应操作,否则的话需要将请求中的字符串从 charactersetconnection 代表的字符集转换为具体操作的列使用的字符集之后再进行操作。
将从某个列获取到的字节串从该列使用的字符集转换为 charactersetresults 代表的字符集后发送到客户端。
客户端使用操作系统的字符集解析收到的结果集字节串。
版权声明: 本文为 InfoQ 作者【一个大红包】的原创文章。
原文链接:【http://xie.infoq.cn/article/9d538b9233cf5a738a2290e60】。文章转载请联系作者。
评论