文章目录
- 服务端处理客户端请求
- 启动项
- 系统变量
- 启动项和系统变量的区别
- 常见的字符集
- 字符集
- 比较规则
服务端处理客户端请求
- 客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。其中大概有三步
- 连接
- sql 解析与优化
- 存储引擎
- 连接管理
- 每当有一个客户端连接到服务器时,服务器都会创建一个线程来专门处理与这个客户端的交互,当该客户端退出时会与服务端断开连接,服务端不会立即把线程销毁,而是缓存起来,当下一次连接来的时候再分配,但是线程分配太多的话就会影响线程,所以我们还需要限制一下可以连接服务器的数量
- 在客户端程序发起连接的时候,需要携带主机信息、用户名、密码,服务器程序会对客户端程序提供的这些信息进行认证,如果认证失败,服务器程序会拒绝连接。另外,如果客户端程序和服务器程序不运行在一台计算机上,我们还可以采用使用了SSL(安全套接字)的网络连接进行通信,来保证数据传输的安全性。
- 解析与优化
- 查询缓存
- Mysql服务器处理查询请求的过程,会把刚刚处理过的查询请求和结果缓存,如果有一摸一样的请求,就直接从缓存中查找结果
- 缺点:如果两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。另外,如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表,如 mysql 、information_schema、 performance_schema 数据库中的表,那这个请求就不会被缓存。
- 语法解析
- MySQL服务器程序首先要对这段文本做分析,判断请求的语法是否正确,然后从文本中将要查询的表、各种查询条件都提取出来放到MySQL服务器内部使用的一些数据结构上来。
- 查询优化
- mysql 会给予你的语句进行一些优化,比如外连接转成内连接,子查询转为连接等等的一堆东西。优化的结果就是生成一个执行计划,这个计划表明了应该使用哪些索引进行查询等等优化方案,我们可以使用explan语句来查看某个语句的执行计划
- 查询缓存
- 存储引擎
- 介绍:
- mysql 把数据的存储和提取操作,放到存储引擎里面,我们逻辑上表是一行行的数据,但是物理上并不是按照这样存储的,具体怎么存储是要根据存储引擎的存储规则存储的,为了实现不同的功能,mysql也有不同的存储引擎管理不同场景下的表格,存储算法也不一样。
- 各种不同的存储引擎向上面的MySQL server层提供统一的调用接口(也就是存储引擎API),包含了几十个底层函数,像"读取索引第一条内容"、“读取索引下一条内容”、"插入记录"等等。
- 常用存储引擎:
- 实用命令
SHOW ENGINES;
- Support 表示该存储引擎是否可用
- Default 表示当前服务器程序的默认存储引擎
- Comment 表示对存储引擎的一种描述
- Transactions 表示该存储引擎是否支持事务处理
- XA 表示该存储引擎是否支持分布式事务
- Savepoints 表示该列是否支持部分事务回滚
- 设置表的存储引擎
- 存储引擎是负责对表中的数据进行提取和写入的,我们可以为不同的表设置不同的存储引擎,也就是说不同的表可以有不同的物理存储结构,不同的提取和写入方式。
- 建表语句:
CREATE TABLE 表名( 建表语句) ENGINE = 存储引擎名称;
- 修改表的存储引擎:
ALTER TABLE 表名 ENGINE = 存储引擎名称;
- 介绍:
启动项
- MySQL的服务器程序和客户端程序也有很多设置项,比如对于MySQL服务器程序,我们可以指定诸如允许同时连入的客户端数量、客户端和服务器通信方式、表的默认存储引擎、查询缓存的大小等设置项。对于MySQL客户端程序,我们之前已经见识过了,可以指定需要连接的服务器程序所在主机的主机名或IP地址、用户名及密码等信息。
- 在命令行上使用选项:
- 在启动服务器的命令后面加上指定启动选项的通用格式:
--启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n]
也就是说我们可以将各个启动选项写到一行中,各个启动选项之间使用空白字符隔开,在每一个启动选项名称前面添加–。 - 举个例子:
- 如果要修改表的默认存储引擎的话,使用下面的语句:
mysqld --default-storage-engine=MyISAM
- 如果要修改表的默认存储引擎的话,使用下面的语句:
- 每个MySQL程序都有许多不同的选项。大多数程序提供了一个–help选项,你可以查看该程序支持的全部启动选项以及它们的默认值。
mysql --help
- 前面举例子的
default-storage-engine
称之为长形式的选项,设计师为了让我们使用方便,会提供一些短的形式,例如:
- 在启动服务器的命令后面加上指定启动选项的通用格式:
- 配置文件使用选项:
- 在命令行中设置启动选项只对当次启动生效,也就是说如果下一次重启程序的时候我们还想保留这些启动选项的话,还得重复把这些选项写到启动命令行中,这样真的很烦呀!于是设计MySQL的大佬们提出一种配置文件(也称为选项文件)的概念,我们把需要设置的启动选项都写在这个配置文件中,每次启动服务器的时候都从这个文件里加载相应的启动选项。由于这个配置文件可以长久的保存在计算机的硬盘里,所以只需我们配置一次,以后就都不用显式的把启动选项都写在启动命令行中了,所以我们推荐使用配置文件的方式来设置启动选项。
- Windows操作系统的配置文件:
- 在Windows操作系统中,MySQL会按照下列路径来寻找配置文件:
- 在Windows操作系统中,MySQL会按照下列路径来寻找配置文件:
- 类Unix操作系统中的配置文件:
- 在类UNIX操作系统中,MySQL会按照下列路径来寻找配置文件:
- 在类UNIX操作系统中,MySQL会按照下列路径来寻找配置文件:
- 配置文件的内容:
- 与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号[]扩起来
- 在配置文件中指定启动选项的语法类似于命令行语法,但是配置文件中只能使用长形式的选项。在配置文件中指定的启动选项不允许加–前缀,并且每行只指定一个选项,而且=周围可以有空白字符(命令行中选项名、=、选项值之间不允许有空白字符)。另外,在配置文件中,我们可以使用#来添加注释,从#出现直到行尾的内容都属于注释内容,读取配置文件时会忽略这些注释内容。为了大家更容易对比启动选项在命令行和配置文件中指定的区别,我们再把命令行中指定option1和option2两个选项的格式写一遍看看:
- 与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号[]扩起来
系统变量
- MySQL服务器程序运行过程中会用到许多影响程序行为的变量,它们被称为MySQL系统变量,比如允许同时连入的客户端数量用系统变量max_connections表示,表的默认存储引擎用系统变量default_storage_engine表示,查询缓存的大小用系统变量query_cache_size表示,MySQL服务器程序的系统变量有好几百条,我们就不一一列举了。每个系统变量都有一个默认值,我们可以使用命令行或者配置文件中的选项在启动服务器时改变一些系统变量的值。大多数的系统变量的值也可以在程序运行过程中修改,而无需停止并重新启动它。
- 查看系统变量:
- 我们可以使用下列命令查看MySQL服务器程序支持的系统变量以及它们的当前值
SHOW VARIABLES [LIKE 匹配的模式];
- 我们可以使用下列命令查看MySQL服务器程序支持的系统变量以及它们的当前值
- 设置系统变量:
- 大部分的系统变量都可以通过启动服务器时传送启动选项的方式来进行设置。
-
通过命令行添加启动选项。
-
通过配置文件添加启动选项。
-
- 大部分的系统变量都可以通过启动服务器时传送启动选项的方式来进行设置。
启动项和系统变量的区别
- 启动选项是在程序启动时我们程序员传递的一些参数,而系统变量是影响服务器程序运行行为的变量
- 大部分的系统变量都可以被当作启动选项传入
- 有些系统变量是在程序运行过程中自动生成的,是不可以当作启动选项来设置,比如auto_increment_offset、character_set_client等。
- 有些启动选项也不是系统变量,比如defaults-file。
常见的字符集
- ASCII字符集
- ISO 8859-1字符集
- GB2312字符集
- GBK字符集
- utf8字符集
字符集
- 因为计算机只能存储二进制数据,如果要存储数据就只能存储二进制数据,当然还需要一个二进制数据跟字符的映射关系,建立这个关系还有几个问题
- 你要把哪些字符映射成二进制数据?
- 也就是界定清楚字符范围。
- 怎么映射?
- 将一个字符映射成一个二进制数据的过程也叫做编码,将一个二进制数据映射到一个字符的过程叫做解码。
- 举个例子:
- 你要把哪些字符映射成二进制数据?
比较规则
- 在我们确定了xiaohaizi字符集表示字符的范围以及编码规则后,怎么比较两个字符的大小呢?最容易想到的就是直接比较这两个字符对应的二进制编码的大小,比方说字符’a’的编码为0x01,字符’b’的编码为0x02,所以’a’小于’b’,这种简单的比较规则也可以被称为二进制比较规则,英文名为binary collation。
- 二进制比较规则是简单,但有时候并不符合现实需求,比如在很多场合对于英文字符我们都是不区分大小写的,也就是说’a’和’A’是相等的,在这种场合下就不能简单粗暴的使用二进制比较规则了,这时候我们可以这样指定比较规则:
- 将两个大小写不同的字符全都转为大写或者小写。
- 再比较这两个字符对应的二进制数据。
- 这是一种稍微复杂一点点的比较规则,但是实际生活中的字符不止英文字符一种,比如我们的汉字有几万之多,对于某一种字符集来说,比较两个字符大小的规则可以制定出很多种,也就是说同一种字符集可以有多种比较规则
- 二进制比较规则是简单,但有时候并不符合现实需求,比如在很多场合对于英文字符我们都是不区分大小写的,也就是说’a’和’A’是相等的,在这种场合下就不能简单粗暴的使用二进制比较规则了,这时候我们可以这样指定比较规则: