《MySQL内核拆解:从SQL到InnoDB》(一) : 数据库基础库操作数据类型
文章目录
- 《MySQL内核拆解:从SQL到InnoDB》(一) : 数据库基础&建库操作
- 1、什么是数据库
- 2、为什么要使用数据库
- 3、数据库类型
- 3.1、关系型数据库
- 3.2、非关系型数据库
- 3.3、数据库服务器,数据库与表之间的关系
- 4、客户端和服务器的通讯方式
- 4.1、C/S架构
- 4.2、B/S架构
- 5、SQL
- 5.1、什么是SQL
- 5.2、 SQL 分类
- 6、MySQL架构
- 6.1、存储引擎
- 7、库操作
- 8、数据类型
- 8.1 整数类型
- 8.2、 浮点与定点类型
- 8.3、字符串类型
- 8.4、 CHAR 与 VARCHAR
- 8.5、 怎么选 CHAR 和 VARCHAR
- 8.6、 VARCHAR 与 TEXT 的区别
- 8.7、日期类型
- 8.8、易错点速查
- 8.9、总结
《MySQL内核拆解:从SQL到InnoDB》(一) : 数据库基础&建库操作
从本章节开始陆续开启mysql数据库专栏的持续更新,如有需要可长期关注
1、什么是数据库
数据库是20世纪60年代末发展起来的⼀项重要技术,已经成为计算机科学与技术的⼀个重要分⽀。数据库技术主要是⽤来解决数据处理的⾮数值计算问题,数据处理的主要内容是数据的存储、查询、修改、排序和统计等。
2、为什么要使用数据库
数据库的设计很有门道,这里我们先对其进行一个初步的了解:
- 数据持久化:数据库可以将数据保存在存储介质中,即使应⽤程序关闭或服务器重启,数据也不会
丢失。 - 数据结构化:数据库能够以结构化的⽅式存储数据,使得数据易于管理和查询。
- 数据完整性:数据库管理系统(DBMS)提供了数据完整性的保障,确保数据的准确性和⼀致性。
- 并发控制:数据库可以处理多个⽤⼾或进程同时访问和修改数据,同时确保数据的⼀致性。
- 安全性:数据库提供了多种安全机制,如访问控制、加密等,保护数据不被未授权访问。
- 可扩展性:随着数据量的增⻓,数据库可以⽔平或垂直扩展,以适应不断增⻓的数据需求。
- 备份和恢复:数据库⽀持数据的备份和恢复,以防数据丢失或损坏。
- 查询优化:数据库系统提供了⾼效的查询优化器,可以快速执⾏复杂的查询操作。
- 事务管理:⼤部分关系型数据库都⽀持事务,确保⼀系列操作要么完全成功,要么完全失败,提⾼了操作的可靠性。
- 多⽤⼾⽀持:数据库允许多个⽤⼾同时访问和操作数据,适合多⽤⼾环境。
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语法中,关键字推荐大写,但是并不强制要求,大小写不敏感
- 查看数据库
showdatabases;- 创建数据库
createdatabaseifnotexistsdb_namecharactersetutf8mb4collateutf8mb4_0900_ai_ci;其中if not exists表示如果该数据库不存在才会创建该名字的数据库character set = utf8mb4是设置 字符集编码collate utf8mb4_0900_ai_ci指定数据库字符集的校验规则,ai 指口音不敏感,ci指大小写不敏感。
- 查看警告信息
showwarninigs;- 查看系统默认字符集和排序规则:
showvariableslike`%character%`;- 修改数据库
alterdatabasedb_namecharacterset[]collate[];- 删除数据库
dropdatabaseifexistsdb_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 个字节。
看看差异:
CREATETABLEvc(vVARCHAR(4),cCHAR(4));INSERTINTOvcVALUES('ab ','ab ');SELECTCONCAT('(',v,')'),CONCAT('(',c,')')FROMvc;-- 结果:(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 年。
常用函数同义词:
CURRENT_DATE/CURRENT_DATE()-- 等价于 CURDATE()CURRENT_TIME/CURRENT_TIME([fsp])-- 等价于 CURTIME()CURRENT_TIMESTAMP/CURRENT_TIMESTAMP([fsp])-- 等价于 NOW()8.8、易错点速查
- LONGTEXT / LONGBLOB 是 4 GB(2^32-1),不是 2^8-1,别被笔误带偏。
- DECIMAL 省略 M、D 时默认是 (10,0),想存小数必须显式写 D。
- CHAR 会吃掉尾部空格,VARCHAR 不会——比较字符串长度时容易出错。
- VARCHAR(65535) 是字节上限,不是字符上限,实际能存多少字取决于字符集:utf8mb4 下一个字符最多 4 字节。
- TEXT 不能直接建普通索引,需要对它做条件查询时,考虑改用 VARCHAR 或加前缀索引。
- TIMESTAMP 只能到 2038 年,需要长期保存的时间字段用 DATETIME。
- 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) |