mysql知识点总结
1.mysql连接
连接的概念
- 连接的本质是多表相连产生的笛卡尔积结果集
- 驱动表和被驱动表,驱动表只访问一次,被驱动表访问多次
- 内连接,左连接,右连接(inner join,left join, right join)
- 内连接中的WHERE子句和ON子句是等价的
- 左连接和右连接,必须使用ON子句来指出连接条件
- 左连接是指以左边的表为准匹配右边表内容,没内容则null取代
连接的原理 - 嵌套循环连接。(for 嵌套的方式)
- 使用索引加快连接速度。
- 基于块的嵌套循环连接。提前划出一块内存(join buffer)存储驱动表结果集中的记录,然后开始扫描被驱动表,每一条被驱动表的记录一次性和这块内存中的多条驱动表记录匹配,可以显著减少被驱动表的I/O操作
2.mysql字符集编码与规则
1.字符集指的是某个字符范围的编码规则。
2.比较规则是针对某个字符集中的字符比较大小的一种规则。
3.在MySQL中,一个字符集可以有若干种比较规则,其中有一个默认的比较规则,一个比较规则必须对应一个字符集。
4.查看MySQL中查看支持的字符集和比较规则的语句如下:
SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];
SHOW COLLATION [LIKE 匹配的模式];
5.MySQL有四个级别的字符集和比较规则
1.服务器级别
1.character_set_server表示服务器级别的字符集,
2.collation_server表示服务器级别的比较规则。
2.数据库级别
创建和修改数据库时可以指定字符集和比较规则:
CREATE DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
character_set_database表示当前数据库的字符集,collation_database表示当前默认数据库的比较规则,这两个系统变量是只读的,不能修改。如果没有指定当前默认数据库,则变量与相应的服务器级系统变量具有相同的值。
3.表级别
创建和修改表的时候指定表的字符集和比较规则:
CREATE TABLE 表名 (列的信息)
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称]];
ALTER TABLE 表名
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称];
4.列级别
创建和修改列定义的时候可以指定该列的字符集和比较规则:
CREATE TABLE 表名(
列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
其他列...
);
ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
6.从发送请求到接收结果过程中发生的字符集转换:
6.1 客户端使用操作系统的字符集编码请求字符串,向服务器发送的是经过编码的一个字节串。
6.2 服务器将客户端发送来的字节串采用character_set_client代表的字符集进行解码,将解码后的字符串再按照character_set_connection代表的字符集进行编码。
6.3 如果character_set_connection代表的字符集和具体操作的列使用的字符集一致,则直接进行相应操作,否则的话需要将请求中的字符串从character_set_connection代表的字符集转换为具体操作的列使用的字符集之后再进行操作。
6.4 将从某个列获取到的字节串从该列使用的字符集转换为character_set_results代表的字符集后发送到客户端。
6.5 客户端使用操作系统的字符集解析收到的结果集字节串。
在这个过程中各个系统变量的含义如下:
系统变量 描述
character_set_client 服务器解码请求时使用的字符集
character_set_connection 服务器处理请求时会把请求字符串从character_set_client转为character_set_connection
character_set_results 服务器向客户端返回数据时使用的字符集
一般情况下要使用保持这三个变量的值和客户端使用的字符集相同。
7.比较规则的作用通常体现比较字符串大小的表达式以及对某个字符串列进行排序中。
3 mysql 访问方法
1、const 通过主键或者唯一二级索引列 等值查询 (火箭)
2、ref ①普通二级索引等值查询,然后回表;②联合索引,最左边的连续索引列是与常数的等值比较(高铁)
3、ref_or_null ,ref 基础上查询null 值
4、range 任意索引 in(),或者范围查找
5、index,遍历二级索引全部记录
6、all,全表扫描