mysql 基础
mysql分为 客戶端/服务端
客户端向服务端发送一段文本(mysql语句),服务器处理后向客户端进程返回一段文本。
查询请求执行过程
客户端-》处理连接-》查询缓存-》语法解析-》查询优化-》存储引擎-》文件系统-》磁盘
大致分为3部分:连接管理、解析与优化、存储引擎。
连接管理
客户端进程可以采用TCP/IP\命名管道、共享内存、UNIC域套接字与服务器建立连接。
每建立一个连接,服务器进程创建一个线程专门处理与这个客户端的交互。客户端退出时,不会销毁当前线程,而是缓存起来,当新的客户端连接是,把这个线程分配个新的。不用频繁创建和销毁线程。
解析与优化
查询缓存
处理查询请求时,会把刚刚处理过的查询请求和结果缓存起来。下一次同样的请求过来,直接从缓存中查找结果。
这个查询缓存在不同的客户端共享。
俩个查询请求字符必须一模一样。
当查询请求中包含某些系统函数。就不使用缓存了。缓存失效。
缓存系统会监测每张表,当表的结构或 数据被修改了。则关于此表的所有缓存删除。
语法解析
查询缓存没有命中,开始进入查询阶段,服务器会对文本进行分析,判断请求的语法是否正确。将要查询的表、各种查询条件都提取出来,放到服务器内部使用的一些数据结构上。
查询优化
mysql的优化程序会对我们的语句做一些优化,比如外连接转换为内连接、 表达方式简化,子查询转为 连接等。
可以使用EXPLAIN语句来查看某个语句的执行计划。
存储引擎
mysql把对数据的存储和提取操作都封装到了存储引擎模块中。
表示由一行一行的记录组成。这只是逻辑上的概念。在物理上如何表示记录,把数据写入具体的物理存储器,都是存储引擎负责的事。
server层与存储引擎交互时,一般以记录为单位。当某个记录符合要求时,先发送到一个缓冲区,缓冲区满了,才向客户端发送真正的记录。
-
常用的存储引擎
-
InnoDB 从Mysql 5.5.5 版本开始作为mysql的默认存储引擎。
-
MyISAM
-
查询当前服务器程序支持的存储引擎 show engines;
support :该存储引擎是否可用
default : 默认的存储引擎
comment : 存储引擎的介绍
transactions: 是否支持事务处理
xa: 是否支持分布式事务
savepoints: 是否支持事务的部分回滚 -
设置表示可以指定表的存储引擎
create table 表名(
建表语句
) engine = 存储引擎名称;
- 修改表的存储引擎
alter table 表名 engine=存储引擎名称;
- 连接mysql
mysql -h主机名 -u用户名 -p密码 -P端口
Mysql的调控按钮-启动选项和系统变量
启动选项和配置文件
Mysql服务器程序和客户端程序有很多设置向。
比如:允许同时连入的客户端数量(默认151)、客户端和服务器的通信方式、表的默认存储引擎(InnoDB)、查询缓存大小等。
在命令行上使用选项
- 禁止客户端使用TCP/IP网络进行通信
mysqld --skip-networking - 存储引擎
mysqld --default-storage-engine=MyISAM
配置文件中使用选项
启动服务器从这个配置文件中加载相应的启动选项。
- 配置文件的路径
- 配置文件内容
分为若干个组
每个组有一个组名,用中括号[]扩起来。
[server]
[mysqld]
[mysqld_safe]
[client]
[mysql]
[mysqladmin]
同一个配置文件中多个组的优先级,以最后一个组中的启动选项为准。
系统变量
Mysql服务器运行过程中会用到许多影响程序行为的变量。被称为系统变量。
查看系统变量
show variables [like 匹配的模式];
如果最后一个连接用户是超级用户。那么就是151+1
设置系统变量
- 通过启动选项设置
启动服务器是传送启动选项的方式来设置。
mysqld --default-storage-engine=MyISAM --max-connections=10 - 服务器程序运行过程中设置
对于大部分系统变量,值可以在服务器程序运行过程中进行动态修改,
(1)设置不同作用范围的系统变量
对于不同的客户端,有不同的值。
俩个范围:global,session.
set global default_storage_engine=MyISAM;
set session default_storage_engine=MyISAM;
show session variables like 'default_storage_engine';
show global variables like 'default_storage_engine';
状态变量
为了更好的了解服务器程序的运行情况,维护了好多关于程序运行状态的变量。称为状态变量。
Threads_connected:多少客户端连接
Innodb_rows_updated: 更新了多少条以InnoDB为存储引擎的表中的记录
show status like 'thread%';
字符集和比较规则
字符集和比较规则简介
计算机中实际存储的是二进制数据,建立字符与二进制数据的映射关系。
1、要把哪些字符映射成二进制数据。
2、怎么映射。将字符映射为二进制数据:编码, 将二进制数据映射到字符:解码
字符集的概念来描述某个字符范围的编码规则。
比较规则简介
怎么比较俩个字符的大小
- 二进制比较规则
直接比较二进制编码的大小,但并不符合现实需求,比如英文字符不区分大小写。a和A是相等的。
需要将大小写不同的字符全部转为大写或小写,然后再比较二进制大小。
一些重要的字符集
- ASCII字符集:128个字符,空格、标点符号、数字、大小写字母和一些不可见字符。使用一个字节来进行编码
- ISO 8859-1字符集:256个字符,在ASCII的字符集上扩充了128个西欧常用字符。
- GB2312字符集:收录了汉字以及拉丁字母、希腊字母、。兼容ASCII字符集。是ASCII采用一字节编码,否则采用俩字节编码。
不同的字节数表示一个字符的编码称为:变长编码方式。
计算机在读取一个字节序列时,怎么区分某个字节代表的是一个单独的字符还是某个字符的一部分。最高位为0就是代表一个单独的字符。
该字节最高位为1,就是俩个字节代表一个单独的字符。 - GBK字符集: 对GB2312的扩充。
- UTF-8字符集: 兼容ASCII字符集,变长编码,1-4字节。
UTF-8是Unicode字符集的一种编码方案,Unicode字符集可以采用UTF-8、UTF-16、UTF-32这几种编码方案,
Mysql不区分字符集和编码方案的概念。都当做字符集来对待。
Mysql支持的字符集和比较规则
字符集表示一个字符所用的最大字节长度在某些方面会影响系统的存储和性能。
- utf8mb3:阉割过的UTF-8字符集,只使用 1-3字节表示字符
- uft8mb4:正宗的UTF-8字符集,使用1-4字节表示字符。
字符集的查看
Default collation表示字符集中的一种默认的比较规则。
Maxlen:最多需要几个字节来表示一个字符。
比较规则的查看
_ai: accent insensitive 不区分重音
_as: accent sensitive 区分重音
_ci: case insensitive 不分分大小写
_cs: case sensitive 区分大小写
_bin: binary 以二进制方式比较
utf8_general_ci: 不区分大小写。
字符集和比较规则的应用
mysql有4个级别的字符集和比较规则
- 服务器级别
character_set_server
collation_server
- 数据库级别
- 表级别
- 列级别
客户端和服务器通信过程中使用的字符集
字符串在计算机上的体现就是一个字节序列,如果使用不同的字符集去解码这个字节序列。得到的是不同的,或者报错。
-
字符集转换
'我'在utf-8字符集编码下的字节序列0xE68891.
先按照utf-8字符集进行解码,然后按照GBK字符集进行编码:0xCED2. -
mysql中字符集转换过程。
客户端发送请求:遵循mysql通信协议。
一般情况下,客户端编码请求字符串时使用的字符集与操作系统当前使用的字符集一直。
类UNIC操作系统是,LC_ALL,LC_TYPE,LANG这三个环境变量的值决定了操作系统当前使用的字符集。
服务器接受请求
每个客户端与服务器建立连接后,服务器都会为该客户端维护一个单独的character_set_client变量。这个变量是session级别的。
客户端在编码请求字符串使用的字符集与服务器在收到一个字节序列后认为该字节序列所采用的编码字符集是俩个独立的字符集。
一般情况下, 这俩个字符集是一致的。
服务器处理请求
在处理请求时,将其转化为session级别的系统变量 character_set_connection对应的字符集编码字节序列。
与之对应的比较规则:collation_connection.这个系统变量表示字符串该使用哪种比较规则。
按照就近原则。列解绑的字符集和排序规则优先级最高
服务器生成响应
会按照session级别的系统变量character_set_results的值进行返回。
character_set_client: 服务器认为请求是按照该系统变量指定的字符集进行编码的
character_set_connection:服务器在处理请求是,会把请求字节序列从character_set_client转换为character_set_connection
character_set_results: 服务器采用该系统变量指定的字符集对返回给客户端的字符串进行编码
客户端接受到响应
客户端会使用默认的字符集来解释这个字节序列。
比较规则的应用
用来比较字符串的大小以及对字符串进行排序。
主要看是否区分大小写。