此博客已停止更新
因为找到了真的很适合我的笔记软件 FlowUs,已经将所有的内容迁移到了此平台。本博客不再更新。
测试理论基础
思维导图学了感觉这些东西比硬技术要好接受不少,太好了!
MySQL-13-高阶知识概览
就是简单的概括一下,有一个基本的概念!
数据库程序逻辑架构
三层结构:最上面的 Connectors 是客户端,比如 JDBC 之类的,不是 DBMS 的范围。最下面的是存在硬盘中的数据,也不是 DBMS 的范围。
第一层:连接层系统(客户端)访问 MySQL 服务器前,做的第一件事就是建立 TCP 连接。 经过三次握手建立连接成功后, MySQL 服务器对 TCP 传输过来的账号密码做身份认证、权限获取。
TCP 连接收到请求后,必须要分配给一个线程专门与这个客户端的交互。所以还会有个线程池,去走后面的流程。每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。
所以连接管理的职责是负责认证、管理连接、获取权限信息。
第二层:服务层第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。
SQL Interface: SQL接口。接收用户的SQL命令,并且返回用户需要查询的结果。
Parser: 解析器。在解析器中对 SQL 语句进行语法分析、语义分析。对SQl查询进行 ...
MySQL-12-索引和性能
原理索引要解决的问题就是在使用 WHERE 语句定位数据的时候,可以通过数据结构进行优化。因此我们在定位数据的时候,尽量使用主键(或者其他有索引的列)进行查询。
B+ 树索引要解决的问题就是在使用 WHERE 语句定位数据的时候,可以通过二叉搜索树来优化。但是由于计算机硬件的特点,(Cache 内存 硬盘)需要尽量多命中 Cache,少硬盘 IO,和需要查询稳定性的需求。所以并没有使用传统的平衡二叉树,红黑树等,而是使用了 B+ 树。
B+ 树的特点就是层级比较少(在树分支处较次数比较少,一般不超过 4 层,二叉搜索树是 logN 层),在查询的时候大大减少了对硬盘 IO 的次数。定位到目标数据所在的硬盘块的时候,就可以一起读入内存中处理,邻近性原理等也大大方便了 Cache 的命中。
而目标数据的那一块在读入内存之后,由于维护了单调的顺序,所以可以采用二分法进行具体定位,所以复杂度是和二叉搜索树一样的,但是大大减少了硬盘 IO 的次数。
物理实现分类按照物理实现,索引可以分为:聚簇索引(一级索引) 和 非聚簇索引(辅助索引、二级索引)。
聚簇索引:这个索引在 InnoDB 里面默认 ...
MySQL-11-字符目录权限
字符集的相关1show variables like 'character%';
character_set_server:服务器级别的字符集
character_set_database:当前数据库的字符集
character_set_client:服务器解码请求时使用的字符集
character_set_connection:服务器处理请求时会把请求字符串从 character_set_client 转为 character_set_connection
character_set_results:服务器向客户端返回数据时使用的字符集
默认编码
如果创建或修改列时没有显式的指定字符集和比较规则,则该列默认用表的字符集和比较规则
如果创建表时没有显式的指定字符集和比较规则,则该表默认用数据库的字符集和比较规则
如果创建数据库时没有显式的指定字符集和比较规则,则该数据库默认用服务器的字符集和比较规则
字符编码处理过程
大小写Linux1、数据库名、表名、表的别名、变量名是严格区分大小写的;2、关键字、函数名称在 SQL 中不区分大小写;3、列名(或字段名) ...
MySQL-10-环境变量-配置文件-触发器
系统变量是 MySQL 服务器有的变量,用于支持服务的运转。
变量级别全局系统变量:MySQL 应用级别,所有的会话均可访问。
会话系统变量:单次的会话级别,不同会话之间隔离。
在 MySQL 中有些系统变量只能是全局的,例如 max_connections 用于限制服务器的最大连接数;有些系统变量作用域既可以是全局又可以是会话,例如 character_set_client 用于设置客户端的字符集(可以作为全局变量设置为默认值,也可以变成会话变量只设置当前会话的字符集);有些系统变量的作用域只能是当前会话,例如 pseudo_thread_id 用于标记当前会话的 MySQL 连接 ID。
查看变量12345#查看满足条件的部分系统变量。SHOW GLOBAL VARIABLES LIKE '%标识符%';#查看满足条件的部分会话变量SHOW SESSION VARIABLES LIKE '%标识符%';
作为 MySQL 编码规范,MySQL 中的系统变量以两个“@”开头,其中“@@global”仅用于标记全局系统变量,“@@sessio ...
MySQL-09-视图-存储过程-函数
视图概念可以将视图理解为存储起来的 SELECT 语句。可以很好的控制数据的访问权限,方便调用。
使用视图就像使用表一样,视图会保存在当前数据库下。直接:
1SELECT * FROM 视图名;
创建视图完全版:
12345CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW 视图名称 [(字段列表)]AS 查询语句[WITH [CASCADED|LOCAL] CHECK OPTION]
精简版:
12CREATE VIEW 视图名称AS 查询语句;
比如:
12345CREATE VIEW salvu50AS SELECT employee_id as ID_NUMBER, last_name as `NAME`,salary*12 as ANN_SALARY -- 别名会作为视图表里面的列名FROM employeesWHERE department_id = 50;
1234CREATE VIEW emp_year_salary (ename,year ...
MySQL-08-约束
概念一些可能会比较模糊的概念:
索引概念index INDEX
只有是独一无二的列才可以作为索引,当列为 UNIQUE 时,默认添加此列为 INDEX。
索引是与表相关的一个可选结构:一个表中可以存在索引,也可以不存在索引,不做硬性要求。
用以提高 SQL 语句执行的性能:快速定位我们需要查找的表的内容(物理位置),提高 sql 语句的执行性能。
减少磁盘 I/O 取数据从磁盘上取到数据缓冲区中,再交给用户。磁盘 IO 非常不利于表的查找速度(效率的提高)。
约束概念constraint CONSTRAINT
对数据的一种限制,用于实现数据库的数据完整性。
独一无二:例如,同一个表中,不能存在两条完全相同无法区分的记录
符合范围:例如:年龄范围0-120,性别范围“男/女”
引用存在:例如:员工所在部门,在部门表中要能找到这个部门
自定义完整性:例如:用户名唯一、密码不能为空等,本部门经理的工资不得高于本部门职工的平均工资的5倍。
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后通过 ALTER TABLE 语句规定约束。
键概念key ...
MySQL-07-数据类型
MySQL中的数据类型
类型
类型举例
整数类型
TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT
浮点类型
FLOAT、DOUBLE
定点数类型
DECIMAL
位类型
BIT
日期时间类型
YEAR、TIME、DATE、DATETIME、TIMESTAMP
文本字符串类型
CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
枚举类型
ENUM
集合类型
SET
二进制字符串类型
BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB
JSON类型
JSON对象、JSON数组
空间数据类型
单值类型:GEOMETRY、POINT、LINESTRING、POLYGON;集合类型:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION
选择建议在定义数据类型时,如果确定是整数,就用 INT; 如果是小数,一定用定点数类型 DECIMAL(M, ...
MySQL-06-表管理-增删改
管理数据库创建数据库1CREATE DATABASE 数据库名 [CHARACTER SET 字符集];
因为 MySQL5 默认字符集是拉丁,所以对于 5 版本的一定要指定字符集为 "utf8"
1CREATE DATABASE test01_office CHARACTER SET "utf8";
注意:DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删旧库完成的。
使用数据库
查看当前所有的数据库
1SHOW DATABASES; -- 有一个S,代表多个数据库
查看当前正在使用的数据库
1SELECT DATABASE(); -- 使用的一个 mysql 中的全局函数
查看指定库下所有的表
1SHOW TABLES FROM 数据库名;
查看数据库的创建信息
1SHOW CREATE DATABASE 数据库名;
使用/切换数据库
1USE 数据库名;
注意:要操作表格和数据之前必须先说明是对哪个数据库进行操作,否则就要对所有对象加上“数据库名.”。
修改数据 ...