当前位置: 首页 > news >正文

MySQL(三):库操作与表操作

目录

一、回顾 MYSQL 对象层次结构

二、创建数据库

语法与案例

三、字符集与校验规则

1. 什么是字符集

2. 查看系统字符集

3. 校验规则

4. 校验规则对数据库的影响

四、数据库操作

1. 查看数据库

2. 使用数据库

3. 查看当前数据库

4. 显示数据库创建语句

5. 修改数据库

6. 删除数据库

五、数据库备份与恢复

1. 数据库备份

2. 数据库恢复

3. 数据库还原原理

六、查看连接情况

1. 查看当前连接情况

2. processlist 字段解析

七、创建数据表

1. 创建表语法

2. 创建表案例

八、查看表结构

1. 查看当前数据库中的表

2. 查看表结构

3. 查看建表语句

九、修改/删除表

1. 添加字段

2. 删除字段

3. 修改字段

4. 修改字段名称

5. 修改表名

6. 删除表

7. 删除表注意事项

总结


一、回顾 MYSQL 对象层次结构

在设计数据库之前,我们需要在脑海中清晰构建MySQL严谨的对象层次结构。这套体系能帮助我们定位数据、规划业务架构

MySQL 内部的数据组织呈现四层结构

  1. 第一层:数据库服务器实例

    • 物理本质:在后台长驻运行的 mysqld 进程。它独占计算机的内存与磁盘存储空间,是整个数据库系统的顶层物理边界

  2. 第二层:逻辑数据库

    • 物理本质:在 mysqld 数据目录下创建的物理文件夹。它是各个独立业务(如电商、OA)的独立命名空间,各个库之间在逻辑上互不越界

  3. 第三层:数据表

    • 物理本质:在对应数据库文件夹内部创建的物理数据文件(例如 InnoDB 引擎下的 .ibd 文件)。表是关系的物理载体,严格定义了业务实体的 Schema 骨架(列数、数据类型、约束)

  4. 第四层:行记录与字段

    • 物理本质:存储在16KB物理数据页中的紧密排列二进制数据片段。列定义了数据结构,而行则记录了实际业务实体的具体信息

理解了从"实例→文件夹→物理文件→页内行数据"这一层级结构后,当我们进行建库操作时,就不再是单纯面对文本指令,而是能联想到操作系统在磁盘底层创建文件夹的实际过程

二、创建数据库

在 MySQL 的实际应用中,创建逻辑数据库远非简单的执行命令。特别是在生产环境中,必须审慎考虑命名规范、字符集兼容以及排序规则


语法与案例

在 MySQL 中,创建数据库的标准语法结构如下:

CREATE DATABASE [IF NOT EXISTS] db_name [CHARSET=charset_name] [COLLATE=collation_name];

语法拆解:方括号 [] 内的内容代表可选参数。IF NOT EXISTS 是防御性子句。如果线上自动化脚本在执行建库时,该库已经存在,不加此子句会导致 SQL 报错中断,而加上之后,MySQL 只会弹出一个 Warning 并继续向下执行,确保了部署脚本的健壮性

基础建库案例:

在终端中执行以下最简建库命令:

CREATE DATABASE IF NOT EXISTS test_db;

这条指令一旦执行成功,mysqld 就会在磁盘上创建一个名为 test_db 的真实文件夹。因为我们没有显式指定字符集和校验规则,它会默认继承 MySQL 服务器全局配置的默认值

指定字符集与校验规则创建数据库

在开发支持多语言或 Emoji 表情的现代 Web 系统(如电商、社交平台)时,无脑使用系统默认配置极易埋下乱码的隐患。标准的工业级建库手法,必须显式指定字符集与校验规则

CREATE DATABASE IF NOT EXISTS shop_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  • CHARACTER SET: 指定数据库采用的字符集,可以缩写为 CHARSET
  • COLLATE: 指定数据库字符集的校验规则

三、字符集与校验规则

在真实的生产环境中,这两大设定直接决定了数据的物理存储格式逻辑比对行为,是保障数据库字符安全的根本准则


1. 什么是字符集

定义:字符集是一套文字符号的物理编码规则。它定义了计算机底层如何将人类可读的字符(汉字、英文、Emoji等)转换成机器识别的二进制字节,以及如何将这些字节反向解码

为什么必须是 utf8mb4?:在早期,MySQL 默认的 utf8 字符集其实是一个 "阉割版"(最大只支持 3 字节)。当用户在起网名或发评论时带入了一个 Emoji 表情(通常占 4 字节),旧版的 utf8 就会因为字节溢出导致后端抛出异常,甚至引发系统崩溃。utf8mb4是 UTF-8 的完全实现版本,全面兼容所有 Unicode 字符,可完整支持 Emoji 表情和各类生僻汉字。作为当前互联网行业的标准编码方案,它已成为业界广泛采用的强制规范


2. 查看系统字符集

我们可以通过以下两条核心查询指令,去查看服务器当前的字符集配置:

① 查看系统当前的默认字符集

SHOW VARIABLES LIKE 'character_set_%';

执行后,服务器会输出一张变量矩阵:

character_set_server 代表 MySQL 服务器全局的默认字符集;character_set_database 代表当前切入的数据库所继承的字符集

② 查看当前引擎支持的字符集

SHOW CHARACTER SET;


3. 校验规则

字符集解决的是数据 "如何安全存储"的问题,而校验规则解决 "如何进行比对与排序"的问题

  • 定义:校验规则是一套用于比较字符大小、决定排序先后以及判断字符是否相等的算法规则

  • 校验规则依赖于字符集。每一种字符集都拥有一套或多套属于它的校验规则。比如,针对 utf8mb4 字符集,MySQL 就衍生出了 utf8mb4_general_ci、utf8mb4_bin 等多种规则

查看支持的校验规则

① 查看当前支持的所有校验规则

SHOW COLLATION;

  • 以 utf8mb4_ 开头的,说明它们是专为 utf8mb4 字符集服务的

  • 以后缀 _ci(Case Insensitive)结尾的,代表大小写不敏感

  • 以后缀 _bin(Binary)结尾的,代表基于二进制编码直接比对

② 查看正在生效的默认校验规则

SHOW VARIABLES LIKE 'collation_%';



4. 校验规则对数据库的影响

校验规则的算法不同,会对上层的业务查询产生颠覆性的影响。

假设我们在一个校验规则为 _ci(大小写不敏感)的数据库里执行:

SELECT * FROM users WHERE username = 'abc';

此时,mysqld 在底层比对数据页时,会启动字母淡化算法,认为 'abc'、'ABC'、'Abc' 完全是同一个东西,从而把它们全部检索出来

而一旦我们将规则切换为 _bin(二进制比对),由于大写字母 'A'(ASCII 码 65)与小写字母 'a'(ASCII 码 97)的二进制机器码截然不同,引擎会执行绝对精确的硬匹配,此时查询 'abc' 就绝对不可能把 'ABC' 检索出来

四、数据库操作

在日常开发和线上运维中,我们需要频繁地对逻辑数据库进行查看、切换、修改和清理。以下是工业界最常用的控制命令


1. 查看数据库

当你想知道当前的 mysqld 实例中究竟托管了哪些项目时,可以使用以下指令:

SHOW DATABASES;

  • information_schema:MySQL 自身的元数据仓库,里面存放着整个服务器所有的表名、列名、访问权限等字典信息

  • mysql:核心配置库,存放着用户账号、核心权限、时区等机密数据

  • performance_schema:专门用于收集数据库运行期性能指标

  • sys:基于前面几个系统库封装的视图,方便运维人员快速排查死锁、慢查询等故障


2. 使用数据库

如前文所述,在对具体的表执行增删改查之前,必须先切入某一个命名空间:

USE test_db;

3. 查看当前数据库

如果由于高频切换而忘记了当前在哪个库中,可以调用内置的 DATABASE() 函数进行查看:

SELECT DATABASE();


4. 显示数据库创建语句

在团队协作中,如果你想知道前人创建某个旧数据库时,究竟用了什么字符集和校验规则,可以使用以下命令打印:

SHOW CREATE DATABASE test_db;

回显中出现的 /*!40100 ... */ 并不是普通的注释,它被称为 "条件注释"。它的意思是:如果当前 MySQL 的版本号大于或等于 4.01.00,就无条件执行注释内部的语句。这保证了 SQL 脚本在不同历史版本之间的平稳兼容性


5. 修改数据库

如果项目在线上运行了一段时间,发现旧库的配置无法满足新业务,可以使用 ALTER DATABASE 语句进行在线重构:

-- 将 test_db 的校验规则修改为 utf8mb4_bin ALTER DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

修改数据库的字符集和校验规则,只会对该命令执行之后新创建的表生效。对于已经在库中存在的旧表,它们依然会保留旧的规则。如果想让旧表全量生效,必须针对每张表单独执行
ALTER TABLE 重构


6. 删除数据库

当项目下线或者测试环境需要清空时,可以使用 DROP 命令进行销毁:

DROP DATABASE [IF EXISTS] test_db;

加上 IF EXISTS 防御性子句可以确保在数据库不存在时脚本不报错、中断

在终端执行 DROP 命令时,MySQL 守护进程会执行以下操作:

  1. 立刻发起系统调用,将物理磁盘上名为 test_db 的真实文件夹删除

  2. 文件夹内部存放的所有表的物理数据文件(.ibd 文件)会被操作系统抹去

  3. 数据瞬间消失。因为这个动作不经过任何操作系统垃圾箱,且在 MySQL 中无法通过 ROLLBACK 撤销。这就是为什么普通研发人员的账号通常没有 DROP 权限的原因

五、数据库备份与恢复

在真实的互联网生产环境中,硬件故障、黑客攻击以及开发人员疲劳操作导致的误删库风险,时刻威胁着企业的数据安全。因此,实现自动化备份与平滑恢复能力,成为必须坚守的数据生命线


1. 数据库备份

既然我们强调 "数据库本质就是操作系统下的物理文件夹",那当我们需要备份时,能不能直接用操作系统的 cp -r 命令或者拖拽压缩包的方式,把数据库文件夹拷贝一份出来呢?

答案是:绝对不行!

线上数据库随时随地都有海量的网络线程在并发读写。当你正在复制物理文件时,MySQL 的存储引擎层可能正在内存里修改着某些 16KB 的数据页,且尚未刷写到磁盘。此时直接复制出来的文件,内部的二进制编码、索引结构往往是对不齐的。这种文件在未来恢复时,会直接触发系统的校验错误,导致数据库因底层物理损坏而拒绝启动

因此,工业界必须使用 MySQL 官方提供的专用备份工具——mysqldump

mysqldump工具

mysqldump 是一个常驻在 MySQL 安装目录下的可执行命令行工具(注意:它是一个独立的程序,需要在系统终端中运行,而不是在 mysql> 提示符内运行)

mysqldump -u用户名 -p密码 [可选参数] 数据库名 > /绝对路径/备份文件名.sql

实战案例:

假设我们要将测试 test_db 数据库全量备份到 Linux 系统的 /var/mysql_backup/ 目录下,并命名为 test_db_backup.sql:

# 在 Linux 操作系统的 Shell 终端中敲下此命令 mysqldump -uroot -pxxx test_db > /var/mysql_backup/test_db_backup.sql

如果想一次性把服务器上的多个库打包备份,可以加上 --databases 参数:

mysqldump -uroot -pxxx --databases shop_db finance_db > multi_db.sql


2. 数据库恢复

假设此时线上不幸发生人为灾难,test_db 被人恶意用 DROP 命令删除。我们需要利用刚刚生成的 脚本,在最短时间内将数据恢复

恢复数据主要有两种标准方法:

在操作系统终端执行重定向(最常用)

在恢复前,因为原库已经被彻底 DROP 物理销毁了,我们必须先登录 mysql> 命令行,重新手动拉起一个同名的空壳数据库:

-- 先在 mysql 客户端内创建一个干净的空库 CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

接着退出 mysql 客户端,回到操作系统的 Shell 终端,利用输入重定向,将备份的 SQL 文本倒灌进去:

# 在操作系统的终端中运行,将备份文件灌入刚刚建好的空库中 mysql -uroot -pxxx test_db < /var/mysql_backup/test_db_backup.sql

在 MySQL 客户端内部恢复

如果你已经登录了 MySQL 终端,不想频繁切出到操作系统,也可以采用以下方式:

-- 1. 先确保空壳数据库已建好并切入 USE test_db; -- 2. 直接在 mysql 提示符内利用 source 命令加载外部 SQL 脚本 source /var/mysql_backup/test_db_backup.sql;

3. 数据库还原原理

source 为什么 mysqldump 生成的 .sql 文本文件能将已经删除的数据库完美复活?我们可以用文本编辑器强行打开 test_db_backup.sql 备份文件一探究竟。

可以看到一系列清晰可读的纯文本SQL语句:

核心底层逻辑:

mysqldump 的本质并不是去拷贝磁盘上的二进制 .ibd 数据页,它做的事情叫 "逻辑备份"

  1. 备份期(逆向解构):它通过扫描数据库的元数据,把当前库里的表结构、真实的行记录,全部逆向翻译、重组成一条条标准的 CREATE TABLE 和 INSERT INTO 的 DDL 与 DML 纯文本命令

  2. 恢复期(正向重放):当我们试图恢复数据时,其实就是命令 mysqld 的 SQL层重新把曾经的建表、插入数据的命令按照历史顺序原封不动地重新在内存和磁盘里 "重放" 了一遍

这种还原机制确保了通过 mysqldump 导出的备份文件具有出色的跨平台兼容性:在 Windows 系统下导出的数据可以无缝还原到运行 Linux 的远程 MySQL 服务器中

六、查看连接情况

当线上生产环境出现突发状况,如大面积请求超时、接口响应延迟或 CPU 使用率瞬时飙升至 100% 时,切忌慌乱无措地盲目猜测问题原因

此时,最常用的指令是SHOW PROCESSLIST。它能实时显示当前所有连接到服务器的客户端及其正在执行的SQL语句


1. 查看当前连接情况

SHOW PROCESSLIST;

如果当前并发较高,为了防止某些超长的 SQL 文本被强制截断,建议使用其完全体版本:

SHOW FULL PROCESSLIST;

服务器执行后将输出一张详尽的实时活动表


2. processlist 字段解析

① Id(连接/线程唯一标识)

MySQL 为每一个连入的客户端指派的唯一会话 ID

当发现10号线程正在执行一条危险 SQL 语句并已卡死秒时,可以通过终端直接执行 KILL 10 命令来紧急处理。MySQL 会立即强制终止该线程的连接,并自动释放该线程持有的所有锁资源,从而实现快速恢复线上服务

② User 与 Host

  • User 代表当前登录的数据库账号

  • Host 展示客户端的IP 地址与端口号

③ db(当前数据库)

展示了该连接目前切换到了哪一个命名空间下。如果显示为 NULL,说明该客户端刚刚通过网络认证登录进来,还没来得及指定任何目标库

④ Command(线程当前的运行期动作指令)

这是排查性能瓶颈的核心指标。最常见的几种工业状态包括:

  • Sleep:代表该连接当前处于空闲休眠状态。也就是说,客户端虽然跟 MySQL 维持着 TCP 长连接,但此时此刻并没有任何 SQL 语句交过来

  • Query:代表该线程活跃,目前正在执行某条 SQL 语句

⑤ Time(状态持续秒数)

代表当前这个线程处于当前 Command 状态下已经持续消耗了多少秒。如果一个线程的 Command 是 Query,而 Time 已经高达上百秒,这就说明该线程遇到了严重的 "死锁阻塞",必须立刻介入

⑥ State(微观执行状态)

展示了 SQL 语句在服务层或存储引擎层流转时的微观卡点。例如:

  • Sending data:说明优化器已经定下了执行计划,执行器和引擎正在磁盘与内存页之间搜寻、搬运、组装数据,并开始通过网络套接字向客户端回传

⑦ Info(真实的 SQL 文本)

此处会直接显示当前连接正在执行的 SQL 语句。使用 SHOW FULL PROCESSLIST 命令时,它会完整展示所有 SQL 语句

七、创建数据表

在 MySQL 的世界里,表是二维关系模型的物理载体。创建一张数据表,不仅需要规定它有多少列,更需要规划每个字段的存储容器与业务约束


1. 创建表语法

在 MySQL 中,在当前切入的逻辑数据库下创建一张新表的标准语法如下:

CREATE TABLE [IF NOT EXISTS] table_name ( field1 datatype [constraints] [COMMENT '列注释'], field2 datatype [constraints] [COMMENT '列注释'], ... fieldN datatype [constraints] [COMMENT '列注释'] ) [ENGINE=engine_name] [DEFAULT CHARSET=charset_name] [COLLATE=collation_name] [COMMENT '表注释'];

语法要素:

  • field:字段名称

  • datatype:数据类型(如整数 INT、定长字符串 CHAR、变长字符串 VARCHAR 等)。决定该列占多少个字节的物理空间

  • constraints:列约束(可选),例如规定该列是否允许为空(NOT NULL)、是否有默认值(DEFAULT)

  • ENGINE / CHARSET / COLLATE:表的物理级参数。MySQL 的存储引擎和字符集是基于表级别可插拔配置的。如果不写,这张表将自动继承它所属数据库的字符集与校验规则,并使用服务器默认的 InnoDB 引擎


2. 创建表案例

以一个高频电商或教务系统常用的 "用户主体表" 为例,演示一套建表流程:

USE test_db; CREATE TABLE IF NOT EXISTS users_tbl ( id INT COMMENT '用户全局唯一编号', username VARCHAR(50) COMMENT '用户登录账号', age INT COMMENT '用户实体年龄' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户核心主体信息表';

为了防止表名与 MySQL 内部的系统保留关键字(如 users)发生冲突,通常会为表名加上 _tbl(table)或 _b(base)等特定业务后缀

八、查看表结构

MySQL 提供了三种标准指令,分别用于查看表的逻辑清单、字段微观定义以及物理建表语句


1. 查看当前数据库中的表

在明确切入某一个逻辑数据库之后,若要盘点当前命名空间下的数据表,可执行以下命令

SHOW TABLES;


2. 查看表结构

若需要进一步下沉到表内部,查看其定义的字段名称、数据类型以及列级约束,可以使用 DESCRIBE 指令(该指令可简写为 DESC):

DESC users_tbl;

字段属性解析:

  1. Field:字段名称,即数据表定义的列名

  2. Type:数据类型,明确限制了该列在底层内所占据的物理存储空间与编码格式

  3. Null:是否允许为空。如果为 YES,代表当插入数据未指定该列时,系统会用 NULL 填充;如果为 NO,则该列属于强约束必填项

  4. Key:索引标记。由于未引入主键及非主键索引,此列目前显示为空

  5. Default:默认值。在未显式插入数据时,该字段自发填充的预设值

  6. Extra:附加扩展信息(例如自增属性 auto_increment 等)


3. 查看建表语句

DESCRIBE 指令虽然能够展示清晰的结构,但它抹去了我们在建表时写入的列注释、表注释以及特定的物理存储参数。若需要还原该表在创建时的完整 SQL 骨架,应使用以下指令:

SHOW CREATE TABLE users_tbl;

通过返回的结果,我们可以获取以下信息:

  • 显式补全属性:MySQL 在物理存储层面会自动补全 DEFAULT NULL 约束,即使建表语句中未显式声明,这一信息也会完整记录在表定义中

  • 物理参数审查:能够明确审查该表当前的存储引擎(ENGINE=InnoDB)、字符集(CHARSET=utf8mb4)以及校验规则(COLLATE=utf8mb4_bin),这是线上故障排查与数据迁移时的重要依据

九、修改/删除表

随着业务需求的不断演进,最初设计的表结构往往无法完全满足后续的功能迭代。此时,我们需要使用 ALTER TABLE 系列语句对已经存在的数据表进行重构

需要注意的是,在生产环境中对已拥有大量数据的表执行 ALTER 操作属于高风险行为,必须严格遵循标准的 DDL 语法。以下是五种最常用的表结构变更操作


1. 添加字段

当需要为已有表引入新的业务维度时,可以使用 ADD 子句在表的末尾或指定位置追加新的列

ALTER TABLE table_name ADD field_name datatype [constraints] [AFTER existing_field / FIRST];

案例:

为 users_tbl 表追加一个用于记录用户电子邮箱的字段 email,要求其类型为变长字符串,且紧跟在 username 字段的后面:

ALTER TABLE users_tbl ADD email VARCHAR(32) COMMENT '用户电子邮箱' AFTER username;

可以发现 email 字段已被插入到指定位置


2. 删除字段

若某个字段因业务线调整不再使用,为节省物理存储空间并提升 I/O 效率,可将其从表结构中将其抹除

ALTER TABLE table_name DROP field_name;

案例:

将 users_tbl 表中的年龄字段 age 执行物理删除:

ALTER TABLE users_tbl DROP age;

DROP 列操作属于不可逆的物理变更。该列对应的所有历史行记录数据会在磁盘文件中同步被抹去,且无法通过回滚进行恢复。在线上环境操作前必须确保该字段在应用层已无任何代码依赖,并做好逻辑备份


3. 修改字段

当字段无法承载现有的业务数据(例如原本定义的 VARCHAR(50) 长度超限,需要扩容到 VARCHAR(150)),或者需要调整其约束与注释时,可以使用 MODIFY 子句

ALTER TABLE table_name MODIFY field_name new_datatype [new_constraints];

案例:

将 users_tbl 表中的 username 字段的长度由 50 扩容至 150:

ALTER TABLE users_tbl MODIFY username VARCHAR(150) COLLATE utf8mb4_bin COMMENT '用户登录账号扩容版';

使用 MODIFY 修改字段属性时,必须在语句中完整地重新声明该字段所需的全部属性(如字符集、校验规则、是否为空等)。如果未显式声明,原有的部分默认属性可能会被新定义的规则直接覆盖。此外,物理类型缩容(如 INT 变 TINYINT)若遇到已有数据溢出,会导致变更失败


4. 修改字段名称

若需要在一个动作中同时修改字段的字面名称以及底层的物理属性,MODIFY 将无法支持,此时必须使用功能更全面的 CHANGE 子句

ALTER TABLE table_name CHANGE old_field_name new_field_name new_datatype [new_constraints];

案例:

将 users_tbl 表中的 id 字段更名为 user_id,并将其数据类型由原本的 INT 变更为更适合分布式全局唯一的 BIGINT:

ALTER TABLE users_tbl CHANGE id user_id BIGINT COMMENT '用户全局唯一大整数编号';


5. 修改表名

在业务重构或数据库版本迁移中,如果需要变更整张二维表名称,可使用 RENAME TO 子句

ALTER TABLE old_table_name RENAME TO new_table_name;

案例:

将当前的 users_tbl 表名修改为更符合系统规范的 account_tbl:

ALTER TABLE users_tbl RENAME TO account_tbl;


6. 删除表

在当前数据库上下文环境下,擦除一张数据表及其内部所有行记录的标准语法如下:

DROP TABLE [IF EXISTS] table_name;

案例:

若要将我们之前重命名后的 account_tbl 表从系统中彻底销毁,可执行以下 DDL 指令:

DROP TABLE IF EXISTS account_tbl;

终端回显 Query OK, 0 rows affected,代表该表在逻辑层与物理层均已被成功抹除


7. 删除表注意事项

当 DROP TABLE 被执行时,存储引擎层会直接触发系统调用,在操作系统的文件系统中将对应的 物理数据文件直接删除

这意味着该表在磁盘上所有数据页以及构建索引,都会在一瞬间被标记为废弃并清空。由于 DDL 操作不经过任何垃圾箱,且无法在事务中被回滚,这在线上生产环境中极易导致灾难性后果。为此,工业界推行了以下三条铁律:

① 严禁在线上直接执行未经评审的 DROP

在互联网企业中,任何对 DROP 特权关键字的使用,必须通过 DBA(数据库管理员)及核心架构师的评审,并只能在低流量的凌晨运维窗口期执行。在应用层的数据库连接账号中,普通微服务所持有的权限应当被死死锁在 DML(增删改)与 DQL(查询)之内,绝对不允许在线上赋予应用账号 DROP 权限

② 理解 DROP、TRUNCATE 与 DELETE 的本质

许多初学者容易混淆这三个同样带有“删除”含义的关键字。在工业治理中,它们有着明确的性能和安全边界:

  • DROP TABLE:属于最高危的DDL。它既销毁数据,也拆毁表的物理骨架,同时在磁盘上释放 .ibd 文件的空间

  • TRUNCATE TABLE:属于高效的DDL。它保留表结构,但清空所有行记录并重置自增计数器。它的原理是直接释放数据页的数据区,其效率远超按行删除,但同样无法回滚

  • DELETE FROM:属于标准的DML。它用于按条件逻辑删除或按行清除内容,但表的结构、索引树完全不动。因为它是逐行给记录打上删除标记,并且会高频写入日志,所以可以被回滚,安全性最高,但面对海量数据时 I/O 吞吐极慢

③ 先下线、后隔离、再销毁

在真实的工业重构中,要销毁一张重要的数据表,绝对不允许一上马就敲下 DROP。标准的操作如下:

  1. 第一步(代码下线):通过全局搜索,将微服务集群中所有对该表的读写代码全部下线或解耦,观察监控至少 1 到 2 周,确保没有任何流量触达此表

  2. 第二步(逻辑隔离):不删除表,而是通过 ALTER TABLE ... RENAME TO ... 指令,为表名加上诸如 _bak_20260609 这样的备份后缀,将其在逻辑上隔离保护起来

  3. 第三步(物理落地):在隔离期内如果系统未发生任何异常报警,说明该表确实已成死表。此时,在确保已有冷备份的前提下,方可最终执行 DROP TABLE 释放物理磁盘空间

总结

综上所述,我们已经掌握了 MySQL 中数据库与数据表的基本管理方法,包括数据库的创建、修改、删除、备份与恢复,以及数据表的创建、查看、修改和删除等常见操作

在此过程中,我们还进一步认识了字符集与校验规则的作用,并通过实验理解了不同校验规则对于字符串比较和查询结果的影响。与此同时,通过 show processlist 等命令,我们也从客户端与服务端模型的角度,进一步理解了 MySQL 的连接管理机制

至此,我们已经能够完成数据库对象的管理工作,但新的问题也随之出现:

表已经创建好了,那么表中的每个字段应该使用什么数据类型?

这些问题都属于数据库表设计中最基础、也是最重要的内容

因此,在下一篇中,我们将正式学习 MySQL 的数据类型体系,深入理解数值类型、字符串类型以及日期时间类型的特点与适用场景,为后续学习约束、索引以及数据库设计打下基础

http://www.jsqmd.com/news/984890/

相关文章:

  • 大理黄金回收2026全流程高价避坑攻略 - 润富黄金回收
  • 自流平材料在现代装修设计中的创新应用及魅力解析
  • Playwright视觉比较(图片比对测试)
  • 伺服电机仿真(7):非线性因素的建模
  • 手把手教你用MATLAB复现圆柱绕流POD分解:从Brunton的代码到自己的流场图
  • 大医精诚·孙思邈
  • /etc/passwd和/etc/shadow区别?用户信息与密码哈希分工详解
  • 2026年实测:各类大赛人气投票链接生成方法,3分钟搞定(免费+强防刷) - 微信投票小程序
  • Linux驱动程序机制
  • AgentWatch MCP 服务说明文档
  • 聚焦脑机接口领域基础研究:国家自然科学基金委与术理创新共同设立民营企业创新发展联合基金(术理创新)
  • 基于 LlamaIndex + DeepSeek + Streamlit 搭建智能问答系统
  • 阳极与阴极浇铸质量检测仪哪家靠谱?上规模生产企业青岛普锐思介绍 - 品牌推荐大师1
  • 高效核销网点系统开发全解析
  • 10kV配网故障识别:波形分析全攻略
  • UVM源码探秘:start_item的sequencer参数怎么用?解锁更灵活的sequence驱动方式
  • 2026最新渭南市黄金回收价格一览表 回收避坑攻略靠谱商家推荐 - 余生黄金回收
  • 镇江丹徒区金价高企,市民闲置黄金变现正当时 - 专业黄金回收
  • 2026年佛山铰链供应商深度横评:全屋定制五金一站式采购避坑指南 - 年度推荐企业名录
  • 人工智能专业术语详解(I)
  • 手上资金少怎么创业?2026零基础低投入创业实操指南
  • Linux基础知识(二)
  • 【国产电脑python编译器配置】麒麟V10系统anaconda配置pycharm
  • 不只是降阶:用POD方法给你的CFD流场做一次‘体检’与‘瘦身’
  • Vue3自定义指令实战:从拖拽到权限按钮,3个真实项目案例手把手教学
  • AI技术落地商业化破局:明图科技以技术创新驱动数字产业实景发展
  • 云南大学考研辅导班正规机构,全维度榜单推荐 - 推荐评测师
  • STM32F4实战:5分钟搞定CANopen快速SDO通信,读取节点数据就这么简单
  • 2026求职季5款主流AI面试工具深度测评:从全真模拟到定向突破
  • 告别虚拟机:实战解析Windbg真机双机调试的3个关键点与性能对比