Mysql 学习

Mysql 学习

MySQL是一个传统的RDBM数据库,也就是关系型数据库,广泛应用于OLTP场景

OLTP(联机事务处理)是传统的关系型数据库的主要应用,用于基本的日常交易处理,例如银行的交易记录
OLAP(联机分析处理)是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并提供直观和易于理解的查询结果。最常见的应用是复杂的动态报告系统
一般来说,OLTP用于日常处理,OLAP用于数据分析

语法

数据类型

MySQL 支持所有标准 SQL 数值数据类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型

MySQL 数据类型 | 菜鸟教程 (runoob.com)

Varchar & char

Char 是一种固定长度的类型,varchar 则是一种可变长度的类型

Varchar 不是越大越好,在内存加载时每次按最大空间分配,varchar 占用空间大

Varchar 会在行记录头部额外用字节存储长度信息

Varchar(n)中 n 在 V5.0以前代表最多存储字节数,之后代表最多存储字符数

Int

在 int(11)中的11仅代表显示长度为11,不影响存储空间(将被废弃)

BLOB&TEXT

BLOB 是一个二进制大对象,可以容纳可变数量的数据
有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB,区别在于可容纳存储范围不同
TEXT 为非二进制文本数据,同样有4种类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT,与 BLOB 相对应

SELECT

子句顺序:

子句 说明 是否必须使用
SELECT 要返回的列或表达式
FROM 从中检索数据的表 仅在从表选择数据时使用
WHERE 行级过滤
GROUP BY 分组说明 仅在按组计算聚集时使用
HAVING 组级过滤
ORDER BY 输出排序顺序
LIMIT 要检索的行数

NULL

在匹配过滤和不匹配过滤中都不返回 NULL 值

COUNT(column)对特定列中具有值的行进行计数,忽略 NULL 值

大小写

Mysql 中查询数据时是否区分大小写取决于以下几个因素:

函数

MySQL 函数 | 菜鸟教程 (runoob.com)

约束

MySQL 唯一约束(Unique Key)要求该列唯一,允许为空,但只能出现一个空值

MySQL 非空约束(NOT NULL)通过 CREATE TABLEALTER TABLE 语句中在某个字段的定义后加上关键字 NOT NULL 作为限定词,来约束该列的取值不能为空

其他

基础知识

操作分类

SQL |DDL、DQL、DML、DCL 和 TCL 命令 - GeeksforGeeks

DDL

数据定义 - Data Definition Language,用于创建、修改和删除数据库结构

DQL

数据查询 - Data Query Language,用于查询架构对象中的数据

DML

数据操作 - Data Manipulation Language,为用户提供添加、删除、更新数据的能力

DCL

数据控制 - Data Control Language,主要处理数据库系统的权限

TCL

事务控制 - Transaction Control Language,主要控制数据库中的事务
事务将一组任务分组到单个执行单元中,每个事务都以特定任务开始,并在组中的所有任务成功完成时结束,如果任何任务失败,事务将失败

三范式

第一范式:数据库表的每一字段都是不可分割的基本数据项
在任何一个关系数据库中,1NF 是对关系模式的基本要求,不满足1NF 的数据库就不是关系数据库

第二范式(依赖性):数据库表中的每个实例或行必须可以被唯一的区分
2NF 建立在1NF 之上,要求实体的属性完全依赖于主关键字,不能仅依赖部分主关键字

第三范式(唯一性): 一个数据库表中不包含已在其它表中包含的非主关键字信息,即属性不依赖于其他非主属性
3NF 建立在2NF 之上,非主键字段不能相互依赖,任何非主属性不依赖于其它非主属性

逆范式: 通过增加冗余或重复的数据来提高数据库的读性能

主键&辅助键&外键

主键和外键约束 - SQL Server | Microsoft Learn

主键

主键(PRIMARY KEY)是用于唯一标识数据库中每条记录的字段,不能包含NULL值
选取主键的一个基本原则:不使用任何业务相关的字段作为主键

一个表只能有一个主键约束,该约束可以包含一个或多个字段,构成主键的多个字段被统一称为联合主键

主键设置:

主键设计:

辅助键

辅助键显示每条记录唯一的辅助值,它可用于标识记录,并且通常被索引,它也被称为备用键一个表可以有多个辅助键

外键

外键 (FOREIGN KEY) 是用于在两个表中的数据之间建立和加强链接的一列或多列的组合,约束两个表中数据的一致性和完整性
相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表),默认情况下子表的记录相关数据删除后,主表才能删除记录

其他

伪列

伪列是指一些具有特殊含义的列名,它们并不是表中实际存在的列,但可以在 SQL 查询语句中使用
伪列的行为与表中的列相同,但并未存储具体数值,因此伪列只具备读属性

常见的伪列:

连接池

你真的知道如何设置数据库连接池的大小吗 - rickiyang - 博客园 (cnblogs.com)

数据库连接池是程序启动时建立的足够多的数据库连接,这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放

创建数据库连接是一个很耗时的操作,MySQL 短连接每次请求操作数据库都需要与 MySQL 服务器建立 TCP 连接,在并发量非常大的情况会有影响

数据库连接池的机制:

  1. 程序初始化时创建连接池
  2. 使用时向连接池申请可用连接
  3. 使用完毕,将连接返还给连接池
  4. 程序退出时,断开连接,并释放资源

MYSQL 的最大连接数在5.7版本中默认是151,最大可以达到16384(2^14)
最大连接数太小造成的后果是连接失败,query failed Error 1040: Too many connections 错误
太大且当连接该数据库的机器比较多的时候则会对 MYSQL 的性能产生影响,因为系统需要同时维护过多的 TCP 连接

MYSQL 官方给出的设置最大连接数的建议比例为 Max_used_connections / max_connections * 100% ≈ 85%

临时表

Mysql 内部临时表是分为内存临时表和磁盘临时表,通常在 union 和 group by 会用到临时表,Extra 会显示 Using temporary
如果 group by 需要统计的数据量较大,内存临时表装不下,就会用到磁盘临时表,所以尽量让 group by 过程用上表的索引,这样就不会用到磁盘临时表