《MySQL内核拆解:从SQL到InnoDB》(一) : 数据库基础&库操作&数据类型

文章目录

《MySQL内核拆解:从SQL到InnoDB》(一) : 数据库基础&建库操作

从本章节开始陆续开启mysql数据库专栏的持续更新,如有需要可长期关注

1、什么是数据库

数据库是20世纪60年代末发展起来的⼀项重要技术,已经成为计算机科学与技术的⼀个重要分⽀。数据库技术 主要是⽤来解决数据处理的**⾮数值计算问题** ,数据处理的主要内容是数据的存储、查询、修改、排序和统计等。

2、为什么要使用数据库

数据库的设计很有门道,这里我们先对其进行一个初步的了解:

  1. 数据持久化 :数据库可以将数据保存在存储介质中,即使应⽤程序关闭或服务器重启,数据也不会
    丢失。
  2. 数据结构化:数据库能够以结构化的⽅式存储数据,使得数据易于管理和查询。
  3. 数据完整性:数据库管理系统(DBMS)提供了数据完整性的保障,确保数据的准确性和⼀致性。
  4. 并发控制:数据库可以处理多个⽤⼾或进程同时访问和修改数据,同时确保数据的⼀致性。
  5. 安全性:数据库提供了多种安全机制,如访问控制、加密等,保护数据不被未授权访问。
  6. 可扩展性:随着数据量的增⻓,数据库可以⽔平或垂直扩展,以适应不断增⻓的数据需求。
  7. 备份和恢复:数据库⽀持数据的备份和恢复,以防数据丢失或损坏。
  8. 查询优化:数据库系统提供了⾼效的查询优化器,可以快速执⾏复杂的查询操作。
  9. 事务管理:⼤部分关系型数据库都⽀持事务,确保⼀系列操作要么完全成功,要么完全失败,提⾼了操作的可靠性。
  10. 多⽤⼾⽀持:数据库允许多个⽤⼾同时访问和操作数据,适合多⽤⼾环境。

3、数据库类型

3.1、关系型数据库

关系型数据库是指采⽤了关系模型来组织数据的数据库,以⾏和列的形式存储数据。关系模型可以简单理解为⼆维表格模型,⽽⼀个关系型数据库就是由⼆维表及其之间的关系组成的⼀个数据组织。

以下几个主流数据库为典型的关系型数据库:

  • Oracle:甲⻣⽂产品,适合⼤型项⽬,业内最强的数据库,没有之⼀,需要收费。
  • MySQL :开源免费,最受欢迎的数据库,在中⼩企业中普及率⾮常⾼,属于甲⻣⽂,主要⽤在电
    商,论坛等。
  • PostgreSQL:加州⼤学伯克利分校计算机系开发的关系型数据库,可以免费使⽤,修改和分发。
  • SQL Sever :微软推出的⼀款专业级数据库,与旗下的操作系统,编程环境配合使⽤,适⽤于中⼤
    型项⽬。
  • SQLite:⼀款轻型的数据库,占⽤资源⾮常低,常⽤于嵌⼊式设备,⼿机APP,桌⾯程序等场景。

3.2、非关系型数据库

  • Redis:流⾏的基于键值对的内存数据库,常⽤作缓存,⽀持数据持久化,⽀持多种数据结构。
  • MongoDB:基于NoSQL的⽂档型数据库,易扩展,⾼性能,⾼可⽤性,⽀持丰富的查询和聚合操作。

3.3、数据库服务器,数据库与表之间的关系

  • 一个数据库服务中可提供多个数据库,一个数据库中可以有多张表。

4、客户端和服务器的通讯方式

4.1、C/S架构

C/S 架构为 客户端/服务端架构模式,客户端需要安装客户端软件,服务端运行在服务器上提供Socket或数据库服务。

优点 :

  • ⼤部分业 务都可以在客⼾端完成,充分利⽤本地的计算机资源
  • 响应速度快
  • 个性化定制能⼒强
  • ⾯向相对固定的⽤⼾群,对信息安全的控制能⼒强

缺点:

  • 需要安装客⼾端才能使⽤
  • 维护成本⾼,任何⼀台电脑上的客⼾端出现问题都需要进⾏维护,升能过程繁琐

4.2、B/S架构

B/S架构全称是浏览器/服务器(Browser/Server)结构,分为Web浏览器、服务器程序、数据库服务三部分,可以理解为是对C/S架构⼀种改进。由于所有的业务逻辑都由服务器程序处理 ,所以客⼾端

仅使⽤浏览器就可以完成所有操作,⼤大 降低了客⼾端的维护成本。

优点:

  • 客⼾端零维护,只需要安装⼀个浏览器即可
  • 所有业务都集中在服务器端 ,业务扩展⾮常⽅便
  • 维护成本低,只需要维护服务器即可
    缺点:
  • 服务器安全与业务处理能⼒需要花费很⼤精⼒与成本
  • 不同浏览器⽀持不尽⼈意

5、SQL

5.1、什么是SQL

SQL 全称为(Structured Query Langurage) 是结构查询语言的简称,用来进行存储数据,查询,更新,管理关系数据库。

5.2、 SQL 分类

  • DDL 【Data Definition Language】 数据定义语⾔,⽤来维护存储数据的结构
    代表指令:create,drop,alter
  • DML 【Data Manipulation Language】 数据操纵语⾔,⽤来对数据进⾏操作
    代表指令:insert,delete,update,select
  • DCL 【Data Control Language】 数据控制语⾔,主要负责权限管理和事务
    代表指令:grant,revoke,commit

6、MySQL架构

这里我们讨论mysql8.0以上的版本,该版本的服务器是由连接池、服务管理⼯具和公共组件、NoSQL接⼝、SQL接⼝、解析器、优化器、缓存、存储引擎、⽂件系统组成

先对其每一层进行基本的的流程理解:

比如:你发一条 SELECT * FROM user WHERE id = 1;

  • 连接层:确认你能连上。

  • 服务层:解析出你要查 user 表,优化器决定使用主键索引。

  • 存储引擎层:InnoDB 去它的 B+ 树里找 id=1 的数据。

  • 文件系统层:如果在内存(Buffer Pool)里没找到,就去磁盘 .ibd 文件里读进内存。

6.1、存储引擎

这里着重强调存储引擎这一层:

存储引擎是MySQL数据库处理数据的核⼼组件,不同的存储引擎对数据如何存储、索引、更新和查询的实现⽅式各有不同,在不同的业务场景可以选⽤合适的存储引擎。MySQL服务器采⽤可插拔的 存储引擎架构,在服务器运⾏时可以动态的加载和卸载。

我们可以使用sql 语法:SHOW ENGINES 语句来查看存储引擎

7、库操作

在sql语法中,关键字推荐大写,但是并不强制要求,大小写不敏感

  • 查看数据库
sql 复制代码
show databases;
  • 创建数据库
sql 复制代码
create database if not exists db_name
character set utf8mb4
collate utf8mb4_0900_ai_ci;

其中 if not exists 表示如果该数据库不存在才会创建该名字的数据库

character set = utf8mb4 是设置 字符集编码

collate utf8mb4_0900_ai_ci 指定数据库字符集的校验规则,ai 指口音不敏感,ci指大小写不敏感。

  • 查看警告信息
sql 复制代码
show warninigs;
  • 查看系统默认字符集和排序规则:
sql 复制代码
show variables like `%character%`;
  • 修改数据库
sql 复制代码
alter database db_name
character set []
collate [];
  • 删除数据库
sql 复制代码
drop database if exists db_name;

注意删库操作非常的危险,谨慎操作

8、数据类型

在java的学习过程中,我们要对实现的一个功能就要把需要的数据抽象成类和属性,在数据库里我们也需要这样,其中类对应的叫实体,属性对应的叫字段

sql 中规定了用于描述字段的数据类型,常用的数据类型有以下几类

  • 数据值类型
  • 字符串类型
  • 二进制类型
  • 日期类型

8.1 整数类型

类型 大小 有符号范围 无符号范围
TINYINT 1 字节 -128 ~ 127 0 ~ 255
SMALLINT 2 字节 -32768 ~ 32767 0 ~ 65535
MEDIUMINT 3 字节 -8388608 ~ 8388607 0 ~ 16777215
INT / INTEGER 4 字节 -2147483648 ~ 2147483647 0 ~ 4294967295
BIGINT 8 字节 -2^63 ~ 2^63-1 0 ~ 2^64-1

补充两点:

  • INTEGER 是 INT 的同义词。
  • BOOL 是 TINYINT(1) 的同义词,0 为假,非 0 为真。

8.2、 浮点与定点类型

类型 大小 说明
FLOAT(M,D) 4 字节 单精度,约精确到小数点后 7 位
DOUBLE(M,D) 8 字节 双精度,约精确到小数点后 15 位
DECIMAL(M,D) 动态 无精度损失,M 最大 65,D 最大 30

M 是总位数,D 是小数位数。DECIMAL 省略 M 时默认 10,省略 D 时默认 0(此时值没有小数点和小数部分);M 不计算小数点和负号。

涉及金额、财务计算,一律用 DECIMAL,不要用 FLOAT/DOUBLE,浮点数会有精度误差。

8.3、字符串类型

类型 最大长度 说明
CHAR(M) 0 ~ 255 字符 定长,默认 1,右补空格
VARCHAR(M) 0 ~ 65535 字节 变长,所有列共享该上限
TINYTEXT 255 字节 小文本
TEXT 65535 字节 文本
MEDIUMTEXT 16,777,215 字节 中文本
LONGTEXT 4 GB 大文本
ENUM 65,535 个元素 枚举,内部存整数
SET 64 个元素 集合,可存零个或多个,内部存整数

二进制版本一一对应:BINARY / VARBINARY / TINYBLOB / BLOB / MEDIUMBLOB / LONGBLOB,区别只是以字节为单位,不做字符集转换。

关于排序规则 :字符列以字符为单位,可单独指定字符集与排序规则(如 utf8mb4 + utf8mb4_0900_ai_ci);二进制列以字节为单位,常用 _bin 结尾的排序规则(如 utf8mb4_bin),比较时直接按字符编码值。

8.4、 CHAR 与 VARCHAR

对比项 CHAR VARCHAR
长度 固定 可变
单位 字符 字符
范围 0 ~ 255,默认 1 0 ~ 65535(所有列共享)
存储 直接开辟固定空间,不足右补空格 用多少开多少
取值 从尾部删除空格 不删除尾部空格
额外开销 无 1~2 字节记录实际长度
性能 浪费空间,但效率高 节省空间,但效率低

长度记录的细节:实际字节数 ≤ 255 用 1 个字节 记录,> 255 用 2 个字节。

看看差异:

sql 复制代码
CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
INSERT INTO vc VALUES ('ab  ', 'ab  ');

SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
-- 结果:(ab  )  |  (ab)

同样插入 'ab ',VARCHAR 原样保留尾部空格,CHAR 取出时把补齐的空格删掉了。

还可以定义 CHAR(0),此时列值只能是 NULL 或空字符串。用途是兼容旧系统:业务上必须有这个属性,但值没有意义。

8.5、 怎么选 CHAR 和 VARCHAR

场景 建议
长度固定 CHAR,如身份证、MD5、学号、邮编
长度不定 VARCHAR,如姓名、地址(但要预留够最长值)

一句话:定长用 CHAR 换速度,变长用 VARCHAR 省空间。

8.6、 VARCHAR 与 TEXT 的区别

维度 VARCHAR TEXT
容量 最大 65535 字节 最大 65535 字节(指定更长时自动升级为 MEDIUMTEXT / LONGTEXT)
存储位置 < 768 字节存在当前行,> 768 存溢出页,行内留地址 整体存在溢出页,行内只留地址
索引 可直接建普通索引 不能建普通索引,只能用 FULLTEXT
性能 较高 较低

选型:长度小且需要索引检索的用 VARCHAR(姓名、邮箱、用户名);长度大且不会拿它做查询条件的用 TEXT(文章正文、日志内容)。

8.7、日期类型

类型 大小 范围 显示格式
DATE 3 字节 1000-01-01 ~ 9999-12-31 YYYY-MM-DD
TIME 3 字节 -838:59:59 ~ 838:59:59 hh:mm:ss.fraction
YEAR 1 字节 1901 ~ 2155 YYYY
DATETIME 8 字节 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 YYYY-MM-DD hh:mm:ss.fraction
TIMESTAMP 4 字节 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 同上

几个说明:

  • fsp 是可选的小数秒精度,范围 0 ~ 6,省略则默认 0。
  • 各类型的 0 值分别为:0000-00-00、00:00:00、0000-00-00 00:00:00、0。
  • TIMESTAMP 只需 4 字节,但上限是 2038 年(著名的 2038 问题);DATETIME 占 8 字节,可存到 9999 年。

常用函数同义词:

sql 复制代码
CURRENT_DATE / CURRENT_DATE()  -- 等价于 CURDATE()
CURRENT_TIME / CURRENT_TIME([fsp]) -- 等价于 CURTIME()
CURRENT_TIMESTAMP / CURRENT_TIMESTAMP([fsp]) -- 等价于 NOW()

8.8、易错点速查

  1. LONGTEXT / LONGBLOB 是 4 GB(2^32-1),不是 2^8-1,别被笔误带偏。
  2. DECIMAL 省略 M、D 时默认是 (10,0),想存小数必须显式写 D。
  3. CHAR 会吃掉尾部空格,VARCHAR 不会------比较字符串长度时容易出错。
  4. VARCHAR(65535) 是字节上限,不是字符上限,实际能存多少字取决于字符集:utf8mb4 下一个字符最多 4 字节。
  5. TEXT 不能直接建普通索引,需要对它做条件查询时,考虑改用 VARCHAR 或加前缀索引。
  6. TIMESTAMP 只能到 2038 年,需要长期保存的时间字段用 DATETIME。
  7. ENUM / SET 内部以整数存储,取值受限,后期增删枚举值要改表结构。

8.9、总结

需求 推荐类型
主键自增 INT UNSIGNED / BIGINT UNSIGNED
金额 DECIMAL(M,D)
布尔标记 TINYINT(1)
定长编码(身份证、MD5) CHAR(N)
长度不定的短文本 VARCHAR(N)
文章正文、大段文本 TEXT / MEDIUMTEXT
图片、文件二进制 BLOB 系列(更推荐存路径)
只有固定几个取值 ENUM
多选标签 SET(或用关联表)
创建时间、更新时间 DATETIME(长期)/ TIMESTAMP(4 字节,注意 2038)
相关推荐
小小AK42 分钟前
生产入库单同步实战:MySQL 到金蝶云星空的带料委外场景拆解
数据库·mysql
360智汇云1 小时前
隔离VPC标准路径:出公网链路的设计与实现
android·服务器·数据库
紫金桥软件1 小时前
紫金桥国产组态软件:安全稳定护航工业现场
数据库·自动化·跨平台·scada·组态软件
qq_436962181 小时前
金蝶云星空数据分析怎么做?
java·数据库·数据分析
坐吃山猪1 小时前
ChromaDB09-数据库操作
数据库·chromadb
IntoTech英途汇骏1 小时前
数据虚拟化平台选型分析:主流厂商解决方案与技术能力对比
数据库
程序猿阿森2 小时前
RAG 落地实践:离线索引 + 在线 FAQ 与混合检索全流程拆解
数据库·人工智能·rag
图特摩斯科技2 小时前
本体建模方式升级:OntoStudio 独创,2D vs 3D 构建本体应用
数据库·3d
天河归来2 小时前
请求原子性实现方式:Redis 互斥与数据库事务协同
数据库·redis·缓存