一、初识mysql
1、mysql数据库实例:运行mysql服务器程序的进程
2、启动mysql客户端程序,参数-h 计算机的ip地址,-u用户名,-p密码
3、客户端和服务器连接过程,客户端进程向服务器进程发送请求并得到响应的过程本质上是进程之间的通信
3.1TCP/IP mysql服务器在启动时会默认申请3306端口号,可以通过启动服务器进程的命令行添加-P参数来指定端口号
3.2 命名管道 启动服务器命令行加上--enable-named-pipe 在客户端加上--protocol=pipe
3.3 共享内存 启动服务器命令行加上--shared-memory 在客户端加上--protocol==memory
4、服务器处理客户端请求(客户端向服务器发送文本mysql语句,服务器向客户端返回结果)
4.1 连接管理:当有一个客户端进程连接到服务器时,服务器都会创建一个线程与它打交道,当该客户端退出时,服务器并不会立即将线程销毁,而是将它缓存起来,当有新的客户端时,就把缓存分配给它,节省了开销,
4.2 解析和优化
4.2.1 查询缓存:服务器会把刚刚处理的查询请求和结果缓存起来,如果有相同的请求 直接从缓存中取。查询缓存会在不同的客户端之间共享,只要修改了表,与 表相关的缓存都会被删除
4.2.2 语法解析:如果换粗没有命中,mysql服务器对文本进行分析,判断语法是否正确。
4.2.3 查询优化
4.3 存储引擎:物理上怎么表示记录,怎么从表中读取数据,怎么把数据写在物理存储器上
常见操作:
(1)服务器支持的引擎: show engines
(2)创建表时 设置存储引擎 create table 表名() engine=InnoDB
(3)修改表存储引擎 alter table 表明 engine=MyISAM
二、mysql启动选项和系统变量
1、在命令行使用选项
1)--skip--networking 禁止使用TCP/IP网络进行通信
2)--default-storage-engine=MyISAM
2、配置文件中使用选项
windows配置文件路径:BASEDIR\my.ini
可以通过--default-extra-file指定额外的配置文件路径
配置文件以[ ]为一个组 例如
[server]
option1
option2=value2
3、系统变量
查看系统变量 show variables like
通过启动选项设置系统变量 --max-connection
服务器程序运行过程中设置
global:影响服务器的整体操作
session:影响某个客户端连接的操作
set [global|session] 系统变量名=值
4、状态变量
查看状态变量语句show status like
三、字符集和比较规则
1、字符集:描述某个字符范围的编码规则
2、常用的字符集
1)ASCII 1个字节
2)gbk 2个字节
3)utf8 3个字节
4)utf8mb3 4个字节 默认的
3、字符集的级别和比较规则
1)服务器级别:可以在配置文件[server]中修改
character_set_server:服务器级别的字符集
collation_server:服务器级别的比较规则
2)数据库级别:create database [character set 字符集名称][collate 比较规则名称]
character_set_database:数据库的字符集
collation_database:数据库的比较规则
3)表级别:create table [character set 字符集名称][collate 比较规则名称]
4) 列级别:create table 表名(列名 字符串类型 [character set 字符集名称][collate 比较规则名称]) alter table 表名 modify 列名 字符串类型 [character set 字符集名称][collate 比较规则名称]
4、各字符集和比较规则
如果创建或修改列时没有显式指定字符集和比较规则,则列默认使用表的字符集和比较规则
如果创建或修改表时没有显式指定字符集和比较规则,则列默认使用数据库的字符集和比较规则
如果创建或修改数据库时没有显式指定字符集和比较规则,则列默认使用服务器的字符集和比较规则
5、客户端和服务器通信过程中使用的字符集
1)客户端发送的请求字节序列是采用哪种字符集进行编码的。这一步骤主要取决于操作系统当前使用的字符集,与default-character-set启动选项有关
2)服务器收到请求字节序列后会认为它是采用哪种字符集进行编码的。这一步骤主要取决于系统变量character_set_client
3)服务器在运行过程中会把请求的字节序列转换为以哪种字符集编码的字节序列。这一步骤主要取决于系统变量 character_set_connection
4)服务器在向客户端返回字节序列时,是采用哪种字符集编码的。这一步骤取决于系统变量character_set_results的值
5)客户端在收到响应字节后,是怎么把它们写到黑框的,主要取决于操作系统使用的字符集
四、InnoDB记录存储结构
1、InnoDB是一个将表中的数据存储到磁盘上的存储引擎,它将数据划分成若干页,以页作为磁盘和内存之间交互的基本单位,页的大小一般划分成16kb
2、InnoDB行格式 :compact redundant dynamic compressed
3、指定行格式:
create table 表名 (列名)row_format=行格式名称
alter table 表名 row_format=行格式名称
4、 记录的额外信息 记录的真实数据
变长字段长度列表 | NULL值列表 | 记录头信息 | 列1的值 | 列2的值 | …… | 列n的值 |
5、记录的额外信息
1)变长字段长度列表:各变长字段的真实数据占用的字节数按照列的逆序顺序存放
2)NULL值列表:用一个二进制位表示是否为null(逆序)
3)记录头信息:用5个字节表示
6、记录的真实数据
隐藏列:row_id 行id 唯一标识一条记录 trx_id:事务id roll_pointer:回滚指针
主键生成策略:1、用户自定义 2、不允许为NULL的unique键 3、隐藏列的row_id
7、char(M)的存储策略:当列采用的是定长编码的字符集时,该列的字节数不会被加到变长字段列表。而采用变长编码的字符集时,会被加到变长字段列表
五 InnoDB索引页(数据页)结构
1、数据页结构
1)File Header 2)Page Header 3)Infimum+Supremum 4)User Records 5)Free Space 6)Page Directory 7)File Tailer
2、记录在页中的存储:每插入一条记录时,都会从Free Space部分申请一个记录大小的空间,并将这个空间划分到User Records部分
3、User Records的记录头信息部分
名称 | 大小 | 描述 |
预留位1 | 1 | 未使用 |
预留位2 | 1 | 未使用 |
deleted_flag | 1 | 标记该记录是否被删除 |
min_rec_flag | 1 | B+树每层非叶子结点中的最小的记录项记录会被添加该标记 |
n_owned | 4 | 一个页面的记录会被分成若干组,每个组有一个记录是带头大哥,其余的都是小弟。带头大哥记录n_owned,小弟记录的n_owned值都为0 |
heap_no | 13 | 表示当前记录在页面堆中的相对位置 |
record_type | 3 | 表示当前记录的类型,0表示普通记录,1表示B+树非叶节点的目录项记录,2表示Infimum记录,3表示Supremum记录 |
next_record | 16 | 下一条记录的相对位置 |
4、delete_flag:标记当前记录是否被删除,删除的记录还会在页中,所有被删掉的记录会形成一个垃圾列表,记录在这个列表中占用的空间称为可重用空间
5、heap_no:将记录排列的结构称为堆,页前面的记录heap_no较小,后面的较大。infimum的heap_no为0。supremum的heap_no为1。Infimum记录是页面中最小的记录。Supremumu记录是页面中最大的记录。
6、record_type:0表示普通记录 1表示B+树非叶节点的目录项记录 2表示Infimum 3表示supremum
7、next_record:表示从当前记录的真实数据到下一条记录的真实数据的距离,箭头指向真实数据开始的地方。
无论怎么对页中的记录进行增删改操作,InnoDB始终会维护记录的一个单向列表,链表的各个节点按照主键值由小到大顺序连接起来
8、页目录:页目录由槽slot组成,槽是每个组的带头大哥的地址偏移量组成。地址偏移量是该记录的真实数据与页面中第0个字节之间的距离
在数据页查找指定主键的记录时,过程为:
(1)通过二分法确定该记录所在分组对应的槽,然后找到该槽所在分组中主键值最小的记录
(2)通过next_record属性遍历该槽所在的组中的各个记录
9、File Header都有上一个页和下一个页的编号,所有的数据页会组成一个双向链表