MySQL入门基础指南

目录

一、什么是数据库?

仅依靠文件存储数据存在以下几个明显缺点:

数据库的存储介质通常包括:

二、主流数据库介绍

三、客户端 VS 服务器

四、推荐看的MySQL安装技术博客

五、数据库的存储介质

数据库的存储介质主要分为以下两类:

具体说明如下:

六、连接 MySQL 服务器

1、参数说明

2、详细解释

1. 连接方式不同

2. 认证机制不同

3. 验证这个理论

4. 解决方案

5. 为什么这样设计?

3、退出 MySQL 客户端

七、服务器管理

1、停止 MySQL 服务器

2、启动 MySQL 服务器

3、重启 MySQL 服务器

4、额外有用的命令

查看 MySQL 服务状态(检查是否正在运行、是否有错误信息)

设置 MySQL 开机自启

禁用 MySQL 开机自启

验证 MySQL 是否成功启动(通过连接到数据库)

5、重要提示

6、扩展:Windows 服务器管理(了解即可)

打开服务管理器的方法

管理服务

补充说明

八、数据库客户端、数据库服务器(服务端)、数据库与表的关系

1、数据库服务器 (Database Server)

2、数据库 (Database)

3、表 (Table)

4、数据库客户端 (Database Client)

5、四者关系总结

6、补充说明

7、核心概念整理

1. 数据库与数据库服务

2. 文件与数据库的对比

3. MySQL 的架构模式

4. 数据库在系统中的实际表现

九、使用案例(先导了解使用,起到认识作用)

1、数据存储路径

2、创建数据库

验证数据库确实已创建

3、数据库删除

4、使用数据库

5、创建数据库表

文件解释

为什么会有这个文件?

与之前版本的区别

总结

6、表中插入数据

7、查询表中的数据

十、数据的逻辑存储结构

行(Row):

列(Column):

补充说明:

十一、MySQL 体系架构概述

1、连接层(Connection Layer)

2、服务层(Server Layer)

3、存储引擎层(Storage Engine Layer)

4、存储层(Storage Layer)

补充说明:

十二、MySQL 客户端

1、$ 作为变量引用符(在您问的命令中就是这个作用)

2、file $(which mysql)

3、ldd $(which mysql)

4、MySQL 客户端 (Client)

特征说明:

5、MySQL 服务端在哪里?

服务端的特征:

十三、SQL 语言分类

1、DDL(数据定义语言 | Data Definition Language)

2、DML(数据操作语言 | Data Manipulation Language)

3、DCL(数据控制语言 | Data Control Language)

补充说明:

十四、存储引擎(了解)

1、查看支持的存储引擎

2、MySQL 存储引擎特性对比表(中英版)

3、关键说明

4、选择建议与注意事项


一、什么是数据库?

        虽然使用文件也可以存储数据,但在实际开发中,数据库提供了更为专业和高效的解决方案。数据库是按照数据结构来组织、存储和管理数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

仅依靠文件存储数据存在以下几个明显缺点:

  • 安全性问题:文件系统难以实现对数据的精细权限控制和安全保护,容易遭受未授权访问或数据泄露。

  • 查询与管理效率低:文件存储不支持高效的数据检索和复杂查询,缺乏统一的数据管理机制。

  • 海量数据存储困难:文件格式不利于存储和处理大规模数据,扩展性和性能受限。

  • 程序控制复杂:在应用程序中直接操作文件容易出错,数据处理逻辑与业务逻辑混杂,维护成本高。

数据库的存储介质通常包括:

  • 磁盘(持久化存储)

  • 内存(高速缓存,提升访问性能)

        为解决上述问题,数据库应运而生。数据库系统能够更有效地组织、存储、管理和保护数据,提供标准化的接口和查询语言(如SQL),大幅提升了数据处理的效率和可靠性。因此,掌握数据库技术已成为衡量程序员专业能力的重要指标之一。


二、主流数据库介绍

目前市场上主流的数据库系统包括以下几种,各具特点,适用于不同场景:

  • SQL Server:微软推出的关系型数据库,深受 .NET 生态开发者的喜爱,适用于中大型企业级项目,具有良好的集成性和功能完备性。

  • Oracle:甲骨文公司旗下的关系型数据库,擅长处理大型项目和复杂业务逻辑,在稳定性和功能丰富性方面表现卓越,但在高并发场景下通常不如 MySQL 轻量。

  • MySQL:全球最受欢迎的开源关系型数据库,现为甲骨文公司所有。以其高并发性能和简易部署著称,广泛应用于电商、社交网络、论坛等互联网场景。不过在对复杂业务和复杂查询的支持上相对较弱。

  • PostgreSQL:起源于加州大学伯克利分校的关系型数据库系统,开源且功能强大,支持私用、商用和学术用途。具有良好的扩展性和标准兼容性,适合复杂查询和高可靠性要求的场景。

  • SQLite:一款轻量级、基于文件的关系型数据库管理系统,遵循 ACID 事务原则。整个数据库以一个库文件形式存在,适用于嵌入式设备及轻量级应用,资源占用极低,内存需求可低至几百KB。

  • H2:采用 Java 编写的嵌入式数据库,作为一个类库可直接集成到应用程序中。特别适合在开发、测试和小型部署环境中作为内存数据库使用,具有启动快、配置简便的特点。


三、客户端 VS 服务器

        在数据库系统中,通常分为数据库服务器数据库客户端两个部分。以 MySQL 为例,当我们使用 mysql 命令连接数据库时,实际上是在启动一个客户端,与运行在服务器上的 MySQL 服务(服务端)进行通信。例如:

此时所使用的 mysql 命令即为 MySQL 客户端工具。服务器端的 MySQL 服务进程可以通过 ps 命令查看,例如:

ps -axj|head -1&&ps -axj|grep mysqld|grep -v grep

该命令提供了更详细的进程信息,适合调试或确认运行环境:

  • ps -axj

    • -a:显示所有用户的进程。

    • -x:包括没有控制终端的进程(如守护进程)。

    • -j:以作业格式显示(包括 PPID、PGID、SID 等信息)。

  • head -1:显示 ps -axj 输出的第一行(即列标题)。

  • &&:如果第一条命令成功(总是成功),则执行后续命令。

  • grep mysqld:过滤出包含 "mysqld" 的行(即 MySQL 进程)。

  • grep -v grep:排除掉 grep mysqld 命令本身的进程(因为 grep 也会包含 "mysqld")。

输出说明:输出显示了 MySQL 进程的详细信息:

  • PPID:父进程 ID(这里是 1,说明由 systemd 或 init 直接启动)。

  • PID:进程 ID(2739800)。

  • PGID:进程组 ID(2739800)。

  • SID:会话 ID(2739800)。

  • TTY:?(没有控制终端,因为是守护进程)。

  • STAT:Ssl(睡眠状态,多线程,是守护进程)。

  • UID:115(运行该进程的用户 ID,通常是 mysql 用户)。

  • TIME:CPU 时间(2:12)。

  • COMMAND:启动命令(/usr/sbin/mysqld)。

更简洁的替代命令:如果只想快速查看 MySQL 是否在运行,也可以使用:

systemctl status mysql

或者:

pgrep mysqld

        其中 mysqld 即为 MySQL 服务器的服务进程。我们通过 mysql 客户端命令实际连接的就是这一服务。进一步地,使用 netstat 命令可以查看网络连接情况,可以看到 MySQL 服务器默认使用 TCP/IP 协议(可能包括 IPv6 版本的 TCP6),并处于监听状态,等待客户端的连接。例如:

        这说明 MySQL 服务器本质上是一个网络服务器当我们使用 mysql 客户端连接时,实际是向 MySQL 服务器发起 TCP 连接请求。连接建立之后,客户端将用户输入的 SQL 语句发送至服务器,服务器接收并解析 SQL,执行相应的数据操作(如查询、更新、删除等),最后将结果返回给客户端。


四、推荐看的MySQL安装技术博客

CentOS 6.5下编译安装MySQL 5.6.14_野马红尘的技术博客_51CTO博客

(12 封私信) CentOS 7 通过 yum 安装 MariaDB - 知乎

Windows下通过MySQL Installer安装MySQL服务_野马红尘的技术博客_51CTO博客


五、数据库的存储介质

数据库的存储介质主要分为以下两类:

  • 磁盘:例如 MySQL 就是一种典型的磁盘数据库。

  • 内存:例如 Redis 就是一种常见的内存数据库。

具体说明如下:

数据库根据存储介质的不同,可分为磁盘数据库内存数据库。内存数据库也称为主存数据库(Main Memory Database)。

        磁盘数据库将数据主要存储在磁盘中,因此在数据持久化方面具有显著优势。为了提升数据存取效率,这类数据库通常也设计有缓存机制。因此,并非所有数据在任何时刻都会立即被刷新到磁盘,部分数据可能暂时驻留在内存中。

        内存数据库则主要将数据存储在内存中,相比磁盘数据库,其数据读取速度更快,能够大幅降低访问延迟。不过,内存数据库并非完全不用磁盘,例如启动信息、初始化数据等内容仍会存储在磁盘上,只是核心的数据操作和计算主要在内存中进行。

        由于内存数据库的数据存储在易失性内存中,一旦数据库主机断电,数据就可能丢失。因此,在服务关闭前,通常需要将内存中的数据转储到磁盘中。甚至很多内存数据库在运行期间也会定期将数据持久化到磁盘,以保障数据的可靠性和可恢复性。


六、连接 MySQL 服务器

我们可以通过以下命令连接 MySQL 服务器:

mysql -h 127.0.0.1 -P 3306 -u root -p

1、参数说明

  • -h:指定要连接的 MySQL 服务器主机地址。127.0.0.1 表示本地主机。

  • -P:指定 MySQL 服务监听的端口号,默认为 3306

  • -u:指定用于连接的用户名,root 为具有最高权限的超级用户。

  • -p:表示需要输入用户密码。密码可直接写在 -p 后面(如 -p123456),也可在回车后单独输入(推荐后者,更安全)。

但是因为我使用的是Ubuntu系统,所以会出现下面的这种情况,下面会讲解解决方法:

        如果连接的是本地 MySQL 服务器(即运行在本机的服务端,下面会讲解数据库服务端和客户端等关系),可省略主机和端口参数,直接使用以下方式连接:

mysql -u root -p

有密码就输入登录密码,没有密码或者免密码就直接按回车(Enter)登录:

        我们能使用 mysql -u root -p 成功登录是因为这个命令实际上是通过 Unix socket 连接 而不是 TCP 连接,并且 MySQL 配置了 auth_socket 插件进行认证。

2、详细解释

1. 连接方式不同

  • mysql -u root -p → 默认使用 Unix socket 连接

  • mysql -h 127.0.0.1 -P 3306 -u root -p → 使用 TCP/IP 连接

2. 认证机制不同

使用 socket 连接时:

  • MySQL 的 auth_socket 插件会检查:

    • 你正在使用的系统用户名

    • 你请求登录的 MySQL 用户名

  • 如果系统用户有权限(比如是 root 或有 sudo 权限),且 MySQL 用户存在,就允许登录

  • 不需要密码,因为系统身份已经验证了

使用 TCP/IP 连接时:

  • MySQL 要求密码认证

  • 即使输入正确密码,如果 root 用户配置为 auth_socket 插件,也会拒绝TCP连接

3. 验证这个理论

登录MySQL后,在MySQL中,我们可以检查 root 用户的认证插件:

SELECT user, host, plugin FROM mysql.user WHERE user = 'root';

很可能你会看到:

4. 解决方案

如果你想通过 TCP/IP 连接(如 127.0.0.1),需要修改认证方式:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;

5. 为什么这样设计?

这是 Ubuntu MySQL 包的安全特性:

  • 防止远程连接使用 root

  • 要求系统级权限才能管理 MySQL

  • 增加安全性,避免密码泄露风险

所以你能用 mysql -u root -p 登录是正常行为,这是 Ubuntu 上 MySQL 的默认安全配置。

3、退出 MySQL 客户端

成功连接后,可以输入 SQL 语句交由服务器执行。若要退出 MySQL 客户端,可输入以下任一命令:

quit
exit
\q

退出后将返回到系统命令行界面,如下:


七、服务器管理

1、停止 MySQL 服务器

# 使用 systemctl (推荐)
sudo systemctl stop mysql

# 或者使用 service 命令
sudo service mysql stop

2、启动 MySQL 服务器

# 使用 systemctl (推荐)
sudo systemctl start mysql

# 或者使用 service 命令
sudo service mysql start

3、重启 MySQL 服务器

# 使用 systemctl (推荐)
sudo systemctl restart mysql# 或者使用 service 命令
sudo service mysql restart

观察MySQL服务器进程的PID,已经发生了变化,说明已经重启了:

4、额外有用的命令

查看 MySQL 服务状态(检查是否正在运行、是否有错误信息)

sudo systemctl status mysql

设置 MySQL 开机自启

sudo systemctl enable mysql

禁用 MySQL 开机自启

sudo systemctl disable mysql

验证 MySQL 是否成功启动(通过连接到数据库)

sudo mysql -u root -p

5、重要提示

1. sudo: 管理服务需要 root 权限,所以必须在命令前加上 sudo

2. 服务名确认: 在极少数情况下,如果是从非官方源安装或其他特殊配置,服务名可能不同。可以使用以下命令列出所有服务来确认:

sudo systemctl list-units --type=service | grep -i mysql

或者

sudo service --status-all | grep -i mysql

这会显示出完整的服务名,确保您使用的是正确的名称。对于从 Ubuntu 官方仓库安装的标准 MySQL,名称就是 mysql

6、扩展:Windows 服务器管理(了解即可)

在 Windows 操作系统中,可以通过图形化的服务管理器来轻松管理系统上运行的各种服务(如 MySQL、Apache 等)。

打开服务管理器的方法

最快捷的常用方法是:

  1. 按下键盘组合键 Win + R,打开“运行”对话框。

  2. 在输入框中键入 services.msc

  3. 按下回车键 Enter 或点击“确定”。

管理服务

在打开的服务管理器窗口中:

  1. 从列表中找到需要管理的服务(例如 MySQL80 或 MySQL,名称取决于安装版本)。

  2. 选中该服务后,可以通过窗口左侧的按钮进行管理:

    • 启动: 运行所选服务。

    • 停止: 终止正在运行的服务。

    • 暂停: 暂时挂起服务(并非所有服务都支持此操作)。

    • 重新启动: 先停止然后再启动该服务。

也可以右键点击服务名称,在弹出的菜单中选择相应操作。

补充说明

  • 服务名称确认: Windows 上的 MySQL 服务名称可能不是简单的 "mysql",通常带有版本号,如 MySQL80MySQL57 或 MySQLRouter 等。请根据您的安装准确找到对应的服务。

  • 设置启动类型(非常重要):右键点击服务并选择“属性”,可以配置其“启动类型”:

    • 自动: 系统启动时自动运行该服务。

    • 自动(延迟启动): 系统启动后稍等片刻再启动,有助于优化开机速度。

    • 手动: 需要用户手动启动,不会随系统自动运行。

    • 禁用: 禁止该服务被启动。

  • 使用命令行管理 (以管理员身份运行 CMD 或 PowerShell):虽然图形界面方便,但命令行在脚本编写或远程管理时更为强大。

    • 启动服务net start <服务名> 或 sc start <服务名>

      • 示例: net start MySQL80

    • 停止服务net stop <服务名> 或 sc stop <服务名>

      • 示例: net stop MySQL80

    • 查看服务状态sc query <服务名>

  • 权限要求: 无论是通过图形界面还是命令行管理服务,都需要管理员权限。如果当前用户不是管理员,操作时会提示您输入管理员凭据。


八、数据库客户端、数据库服务器(服务端)、数据库与表的关系

        在一个完整的数据库应用体系中,数据库客户端、数据库服务器、数据库和表构成了一个清晰的层次关系,共同协作以实现数据的存储、管理和访问。

1、数据库服务器 (Database Server)

  • 它是核心,指安装并运行在物理机器上的数据库管理系统(DBMS) 软件(如 MySQL Server、PostgreSQL)。

  • 负责管理所有的数据库,处理连接请求、执行SQL操作、维护数据完整性与安全,并控制并发访问。

  • 作为一个常驻运行的网络服务,监听特定端口(如MySQL的3306),等待客户端连接。

2、数据库 (Database)

  • 由数据库服务器创建和管理,是用于组织数据的逻辑容器

  • 通常,一个应用对应一个数据库,实现了数据的隔离。

  • 一个数据库服务器可以托管多个数据库

3、表 (Table)

  • 存在于数据库内部,是存储实际数据的基本结构

  • 每张表对应一个实体(如用户、订单),通过行和列来组织数据。

  • 一个数据库中包含多张表,这些表之间可以通过关系(如外键)相互关联。

4、数据库客户端 (Database Client)

  • 是与用户或应用程序交互的工具或程序,用于连接并操作数据库服务器(如 mysql 命令行工具、Navicat、PHP/Python应用程序)。

  • 客户端通过网络协议(如TCP/IP)向服务器发送SQL命令(如 SELECTINSERT)。

  • 服务器执行命令后,将结果返回给客户端。

5、四者关系总结

组件角色与功能关系比喻
数据库服务器管理者:提供核心数据服务,管理多个数据库。银行总部
数据库保险库:归类存放数据,每个应用一个“库”,实现数据隔离。银行中的不同金库(个人/对公)》
货架/抽屉:在每个金库中,用于结构化存储特定类型的数据(实体)。金库中存放特定物品的货架
数据库客户端柜员或ATM机:用户通过它与总部交互,提交操作请求(存/取款)并获取结果。你与银行交互的窗口

关系流程用户/程序 → 通过数据库客户端 → 连接到数据库服务器 → 选择操作的数据库 → 对其中的进行增删改查。

6、补充说明

  • 通信方式:客户端与服务器之间通常通过网络(如TCP/IP)进行通信,遵循特定的数据库协议(如MySQL协议)。

  • 一个典型操作流程

    • 客户端(如mysql -u root -p)发起连接到服务器(127.0.0.1:3306)。

    • 认证成功后,客户端选择数据库(USE mydatabase;)。

    • 客户端发送SQL操作指定表中的数据(SELECT * FROM users;)。

    • 服务器执行后,将users表的结果集返回给客户端显示。

        这个结构确保了数据管理的秩序、安全性和效率。这种层次结构可表示为:数据库客户端 → 数据库服务器 → 多个数据库 → 每个数据库包含多张表

上图清晰地展示了数据库体系中的层次关系:

  • Client(客户端): 对应 MySQL 客户端工具(如 mysql 命令),用于连接服务器并执行操作。

  • MySQL(服务器): 对应 mysqld 服务进程,是数据库系统的核心,负责管理数据、处理请求并返回结果。

  • DB(数据库): 代表由 mysqld 管理的多个逻辑数据库。通常每个应用对应一个数据库,实现数据隔离。

  • : 存在于每个数据库中,是实际存储数据的结构化实体,每张表对应一种业务数据(如用户表、订单表)。

关系总结:用户通过Client连接到MySQL服务器,访问指定的DB,并对其中的进行增删改查等操作。这种分层结构实现了数据的有序管理和高效访问。

7、核心概念整理

1. 数据库与数据库服务

  • 数据库:指在磁盘或内存中,按照特定结构组织的数据集合。它是在磁盘上存储数据的一套完整方案。

  • 数据库服务:指 mysqld 进程,它是 MySQL 服务的服务器端,负责管理数据库的存储、访问和操作。

2. 文件与数据库的对比

  • 普通文件虽然能存储数据,但缺乏有效的数据管理能力(从用户角度)。

  • 数据库提供了一套完整的数据存储与管理解决方案,用户只需提出需求(如查询条件),数据库直接返回结果。

3. MySQL 的架构模式

  • MySQL(mysql):是数据库服务的客户端

  • mysqld:是数据库服务的服务器端

  • MySQL 本质是一种基于 C/S(客户端/服务器)架构的网络服务

4. 数据库在系统中的实际表现

通过一个示例说明 MySQL 在 Linux 系统中的实际体现:

  • 创建数据库:本质是在 Linux 下创建一个目录

  • 创建表:本质是在该数据库目录下创建对应的文件

  • 数据库的本质:也是文件,但这些文件不由程序员直接操作,而是由 mysqld 服务代为管理。


九、使用案例(先导了解使用,起到认识作用)

1、数据存储路径

        通过MySQL创建的数据库和各种表结构,最终会以文件的形式存储下来,通过查看MySQL的配置文件中的datadir可以得知数据文件的存储路径。比如我的Ubuntu 20.04机器的MySQL配置文件的绝对路径为/etc/mysql/mysql.conf.d/mysqld.cnf,配置文件中datadir对应的值为/var/lib/mysql。如下:

将来MySQL创建的数据库文件都会存储在该目录下,可以看到该目录下有很多MySQL相关的数据文件。如下:

2、创建数据库

连接MySQL服务器后,通过create语句创建一个名为helloworld的数据库。比如:

create database helloworld;

这时/var/lib/mysql目录下,就会多出一个名为helloworld的目录。如下:

        在以前的版本中,helloworld目录下可能出现只有一个名为的db.opt的文件,该文件中指明了当前数据库的默认字符编码和字符校验规则(关于是什么的概念,后面的博客中会正式引入)。但是(现在先了解即可):

  • db.opt 文件是在 MySQL 初始化一个新数据库时创建的。在 MySQL 5.7 及更早版本中,这个文件确实会立即出现。

  • 然而,从 MySQL 8.0 开始,行为发生了变化。 为了提升性能和整合数据字典,MySQL 8.0 将数据库的元数据(包括默认字符集和排序规则)统一存储在了新的、共用的数据字典表(InnoDB 表)中,这些表位于 MySQL 的系统表空间(通常是 ibdata1 文件)里。

  • 在 MySQL 8.0+ 中,db.opt 文件不再是必须的。它可能会在特定操作后生成,也可能永远不会生成。它的存在更多是为了向后兼容或便于某些备份工具工作。

验证数据库确实已创建

虽然目录是空的,但您的数据库已经成功创建了。您可以在 MySQL 客户端中通过以下命令验证:

SHOW DATABASES LIKE 'helloworld';

或者查看它的默认字符集设置:

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'helloworld';

这条命令会从内置的 information_schema 数据库中查询信息,这正是 MySQL 8.0 存储元数据的地方。

项目情况解释
MySQL 版本8.0.42这是关键信息。MySQL 8.0 改变了元数据存储方式。
操作CREATE DATABASE helloworld;仅创建了空数据库,未创建任何表。
现象helloworld 目录为空完全正常。在 MySQL 8.0+ 中,空数据库的目录就是空的。
元数据存储位置information_schema 系统数据库字符集、排序规则等设置现在存储于此,而不是 db.opt 文件。

3、数据库删除

        所以我们创建数据库的本质就是在MySQL的数据存储路径下新建了一个目录,而当我们将这个数据库删除后,可以看到下图此时在MySQL的数据存储路径下的helloworld目录也就不存在了,因此删除数据库本质就是删除数据存储路径下对应的目录。比如:

drop database helloworld;

4、使用数据库

使用数据库之前,可以先通过show语句查看当前都有哪些数据库,然后再通过use语句使用指定的数据库。比如:

show databases;

use helloworld;

使用数据库可以理解成,就是使用cd命令进入到该数据库对应的目录当中。

5、创建数据库表

这里我们通过create语句创建一个简单的student表。比如:

create table student(
id int,
name varchar(32),
gender varchar(2)
);

通过show语句可以查看创建的student表结构。比如:

这两种查看方式的主要区别在于输出格式

show create table student;
  • 表格格式:以行列表格形式显示结果

  • 可读性:在终端中显示可能会换行,比较混乱

  • 适合:快速查看,但格式可能不整齐

show create table student \G
  • 垂直格式:使用 \G 代替分号,以键值对形式垂直显示结果

  • 可读性更清晰易读,每个字段单独一行显示

  • 适合:查看包含长文本(如建表语句)的详细结果

简单说:\G 让输出格式更整洁,更容易阅读长的SQL语句。 在处理包含复杂结构的数据时,\G 是更好的选择。

结合上面创建的 student 表,现在 helloworld 目录中出现的 student.ibd 文件是 MySQL 8.0 中 InnoDB 存储引擎的表空间文件

文件解释

student.ibd:这是 student 表的独立表空间文件。

为什么会有这个文件?

在 MySQL 8.0 中,默认使用 InnoDB 存储引擎,并且默认配置为:

  1. 每表一个表空间:每个 InnoDB 表都有自己的 .ibd 文件

  2. 存储内容:这个文件中包含了:表的数据(插入的记录)、表的索引、该表相关的元数据信息

与之前版本的区别

  • MySQL 5.7 及以前:可能会看到 .frm 文件(表结构定义)和 .ibd 文件

  • MySQL 8.0+只有 .ibd 文件,因为表结构信息现在存储在系统数据字典中(在 ibdata1 文件里),不再需要单独的 .frm 文件

总结

文件说明
student.ibdstudent 表的独立表空间文件,包含表的数据和索引
没有 db.opt数据库配置信息存储在系统数据字典中
没有 .frm表结构信息也存储在系统数据字典中

这说明 student 表已经成功创建,并且 MySQL 正在使用现代的 InnoDB 表管理方式。当向表中插入数据时,数据就会存储在这个 student.ibd 文件中。

6、表中插入数据

通过desc语句可以查看对应的表结构,而不是内容,是相关属性的意思。比如:

desc student;

通过insert语句可以向表中插入数据。比如:

7、查询表中的数据

通过select语句可以查看表中的数据。比如:

select * from student;


十、数据的逻辑存储结构

        在 MySQL 中,表中数据的组织形式可以直观地理解为一个二维表格,它由行(Row)和列(Column)共同构成,是关系型数据库中最基本的数据存储逻辑。其结构如下所示:

行(Row)

        表中的每一行代表一条完整的记录(Record),也就是一个实体的具体信息。例如,在 student 表中,每一行就对应一名学生的全部数据。

列(Column)

        每一列代表一个属性或字段(Attribute/Field),用于描述记录的某一方面特征。例如,student 表中的 name 列存储学生姓名,age 列存储学生年龄。

补充说明:

  • 这种行列结构使得数据的存储非常有条理,既便于理解,也方便通过 SQL 进行查询、更新和管理。

  • 每张表通常还会有一个主键(Primary Key),用于唯一标识每一行记录,确保数据的唯一性和完整性。

  • 不同的列可以定义不同的数据类型(如 INT, VARCHAR, DATE 等),以适应不同种类的数据存储需求。


十一、MySQL 体系架构概述

        MySQL 是一款高度可移植的关系型数据库管理系统,支持主流操作系统包括 Linux、Windows、macOS 和 Solaris 等。虽然不同平台在底层实现上存在差异,但 MySQL 保持了跨平台的物理和逻辑体系结构的一致性,为用户提供了统一的操作和开发体验。

如上图所示,其整体架构可划分为以下四个核心层次:

1、连接层(Connection Layer)

  • 负责客户端连接的建立、用户身份认证、安全方案实施(如 SSL 加密)以及连接池管理。

  • 处理并发连接请求,验证用户权限,确保通信安全。

2、服务层(Server Layer)

是 MySQL 的“大脑”,完成核心逻辑处理:

  • SQL 接口:接收并处理 SQL 命令。

  • 解析器:进行词法、语法分析,生成解析树。

  • 优化器:制定最优查询执行计划,选择索引与连接策略。

  • 缓存管理:查询缓存(注:MySQL 8.0 已移除查询缓存)。

  • 内置函数:执行日期、数学、字符串等内置操作。

  • 支持存储过程、触发器、视图等高级功能。

3、存储引擎层(Storage Engine Layer)

  • 采用可插拔式架构,支持多种存储引擎(如 InnoDB、MyISAM、Memory 等)。

  • 负责数据的实际存储与读取

  • 服务层通过统一的存储引擎 API 与不同引擎交互,引擎根据其特性实现事务、锁、索引等机制。

4、存储层(Storage Layer)

  • 是数据的最终物理存储位置,通过文件系统(如 ext4、NTFS)或裸设备管理磁盘数据。

  • 存储引擎在该层读写数据文件(如 .ibd、.frm、.myd 等)。

补充说明:

  • 这种分层且模块化的设计,使得 MySQL 在保持高性能的同时,具备了良好的灵活性和可扩展性。

  • 用户可以根据业务需求选择合适的存储引擎,例如 InnoDB 适用于需要事务的场景,而 MyISAM 适用于读多写少的场景。


十二、MySQL 客户端

MySQL 客户端泛指所有能够向 MySQL 服务器发送 SQL 语句的工具或程序,主要包括:

  • 命令行工具:如 mysql 命令,是常用的交互式客户端(也就是我们现在使用的这种)

  • 语言接口客户端:MySQL 为多种编程语言(如 C/C++、Python、Java、PHP、Go 等)提供了官方的或第三方的数据库驱动和连接库,允许开发者通过代码调用接口执行 SQL。

例如,标准的 mysql 命令行工具本身是一个由 C/C++ 编写的可执行程序。可通过以下命令查看其信息:

file $(which mysql)
ldd $(which mysql)

1、$ 作为变量引用符(在您问的命令中就是这个作用)

$(command) 是命令替换的语法:

  • 先执行 which mysql 这个命令

  • 然后用该命令的输出结果(即mysql的路径)替换整个 $(which mysql) 部分

2、file $(which mysql)

作用:查看 mysql 客户端程序的文件类型信息

  • which mysql:找到 mysql 命令的完整路径(如 /usr/bin/mysql

  • file:分析该文件的类型

  • 输出示例:会显示这是一个 ELF 可执行文件、动态链接库信息、以及适用的架构(如 x86-64)

简单说:告诉你 mysql 程序是什么类型的文件。

3、ldd $(which mysql)

作用:查看 mysql 客户端程序依赖哪些共享库(动态链接库)

  • ldd:列出二进制文件所依赖的所有共享库

  • 输出示例:会显示一长串 .so 文件(如 libmysqlclient.solibc.so.6 等)及其内存地址

简单说:告诉你 mysql 程序运行需要哪些额外的库文件。

命令用途输出内容
file $(which mysql)查看文件属性文件类型、格式、架构
ldd $(which mysql)查看依赖关系所需共享库列表及路径

回顾一下:这两个命令常用于故障排查,比如程序无法运行时检查是否缺少依赖库,或者确认程序的版本和架构。

        输出结果将显示其依赖的动态链接库,说明它是基于 MySQL 提供的 C API 开发的。因此,无论是命令行工具还是应用程序,本质都是通过调用 MySQL 提供的各语言接口客户端与服务器进行交互。

4、MySQL 客户端 (Client)

root@hcss-ecs-1c15:~# mysql 这个界面是 MySQL 客户端

特征说明:

  • 图片中是在操作系统命令行中执行了 mysql 命令

  • 出现了 Welcome to the MySQL monitor... 欢迎信息

  • 显示 Your MySQL connection id is 10(连接ID为10)

  • 显示 Server version: 8.0.42...(服务器版本信息)

  • 出现 mysql> 提示符,等待输入SQL命令

这是一个客户端工具,用于连接和操作MySQL服务器。

5、MySQL 服务端在哪里?

MySQL 服务端(Server)在后台运行,并没有在前台直接显示出来。

服务端的特征:

  • 是一个常驻内存的守护进程(通常是 mysqld

  • 在后台持续运行,监听网络端口(默认3306)

  • 接收客户端的连接请求

  • 处理SQL查询并返回结果

  • 管理数据库文件的读写


十三、SQL 语言分类

        SQL(Structured Query Language,结构化查询语言)是一种专用于关系型数据库(重点!!!)的标准化语言(一般使用小写,大写也是可以的,不过大写的不宜看并且还要切换大小写,比较麻烦,还是推荐使用小写,通俗易懂),用于执行数据查询、数据操作、数据库结构管理及权限控制等任务。

根据其功能的不同,SQL 语句通常可分为以下三类:

1、DDL(数据定义语言 | Data Definition Language)

  • 用于定义和管理数据库对象(如表、索引、视图等)的结构。

  • 常用语句包括:

    • CREATE:创建数据库或表

    • ALTER:修改现有数据库对象

    • DROP:删除数据库或表

    • TRUNCATE:清空表内容(保留结构)

2、DML(数据操作语言 | Data Manipulation Language)

  • 用于对数据库中的数据进行增、删、改等操作。

  • 常用语句包括:

    • INSERT:插入新数据

    • UPDATE:更新已有数据

    • DELETE:删除数据

在实际应用中,常将查询类语句单独归类为 DQL(数据查询语言 | Data Query Language),主要包括:

  • SELECT:查询数据

  • FROMWHERE 等子句用于构建查询条件

3、DCL(数据控制语言 | Data Control Language)

  • 用于控制数据库访问权限和事务管理。

  • 常用语句包括:

    • GRANT:授予用户权限

    • REVOKE:撤销用户权限

    • COMMIT:提交事务

    • ROLLBACK:回滚事务

补充说明:

  • 有些分类方式还会包括 TCL(事务控制语言 | Transaction Control Language),用于管理事务,如 COMMIT 和 ROLLBACK

  • 不同数据库系统(如 MySQL、PostgreSQL、Oracle)对 SQL 语法的支持略有差异,但核心分类保持一致。

  • SQL 是一种声明式语言,用户只需指定“做什么”,而不需关心“如何做”,具体执行由数据库引擎优化完成。


十四、存储引擎(了解)

        存储引擎是数据库管理系统的核心组件,负责管理数据的存储方式、索引建立、数据更新和查询等底层功能的实现。MySQL 采用插件式存储引擎架构,允许用户根据实际需求选择合适的存储引擎,甚至在同一数据库中为不同表配置不同的存储引擎。

1、查看支持的存储引擎

通过以下 SQL 命令可以查看当前 MySQL 服务器支持的所有存储引擎:

SHOW ENGINES;

        观察列出的存储引擎表可以看出,MySQL 默认使用的存储引擎是 InnoDB,它支持事务、行级锁、外键约束等关键特性,适用于大多数需要高可靠性和并发性能的应用场景。

2、MySQL 存储引擎特性对比表(中英版)

特性MyISAMBDBMemoryInnoDBArchiveNDB
存储限制64TB
事务支持
锁定粒度表锁页锁表锁行锁行锁行锁
MVCC/快照读
地理空间支持
B树索引
哈希索引
全文索引✅ (8.0+)
聚簇索引
数据缓存N/A
索引缓存N/A
数据压缩
数据加密
存储成本N/A非常低
内存成本中等
批量插入速度非常高
集群支持
复制支持
外键支持
备份/时间点恢复
查询缓存支持
更新数据字典统计信息

✅ = 支持,❌ = 不支持,空白 = 视版本或配置而定

3、关键说明

  • MVCC:多版本并发控制,是 InnoDB 实现高并发的重要机制。

  • 存储成本:指数据在磁盘上占用的空间大小。

  • 内存成本:指引擎运行时所消耗的内存大小。

  • BDB(Berkeley DB)引擎现已较少使用,官方不再积极维护。

  • Archive 引擎非常适合存储大量历史归档数据。

  • NDB 是用于 MySQL Cluster 的集群存储引擎。

4、选择建议与注意事项

  • InnoDB:适用于绝大多数需要事务安全(如金融系统)、并发控制(行级锁)和外键约束的应用。是 MySQL 的默认引擎,也是推荐的首选。

  • MyISAM:适用于读多写少、不需要事务的场景(如日志系统、数据仓库查询)。不支持事务和行级锁

  • Memory:所有数据存储在内存中,速度极快,但重启后数据丢失。适用于临时表或缓存。

  • Archive:专为高速插入和压缩存储设计,适用于历史数据归档,不支持索引更新。

  • NDB:适用于分布式集群环境,提供高可用性和实时性。

重要提示:在实际选择存储引擎时,请务必结合业务的读写比例、事务要求、一致性需求和性能目标进行综合考量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96604.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【实战中提升自己完结篇】分支篇之分支之无线、内网安全与QOS部署(完结)

1 1拓扑 「模拟器、工具合集」复制整段内容 链接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil1 分支无线部署 说明&#xff1a;分支无线用瘦AP部署&#xff0c;通过VPN直接注册到总部的AC上面&#xff0c;实现无线的业务提供&…

带你了解STM32:GPIO通用输入输出口

目录 3.1 GPIO简介 3.2 GPIO基本结构 3.3 GPIO位结构 输入部分&#xff1a; 二极管的保护作用&#xff1a; 施密特触发器&#xff1a; 片上外设端口 输出部分&#xff1a; MOS管 3.4 GPIO模式 3.4.1 浮空/上拉/下拉输入 3.4.2 模拟输入 3.4.3 开漏/推挽输出 3.4.…

Http(自写)

作为一个程序员&#xff0c;假设我们要在a电脑的进程里发一段数据到b电脑&#xff0c;一般使用socket编程&#xff0c;可选项也就tcp&#xff0c;udp二选一socket本质上就是一个代码库tcp有粘包问题&#xff08;字节流&#xff09;&#xff0c;纯裸tcp不能之际拿来使用所以我们…

C#使用OpenVinoSharp和PP-Human进行行人检测

效果 项目依赖 OpenCvSharp 4.11.0.20250507 OpenVINO.CSharp.Windows 2024.0.0.1 主要代码 using OpenCvSharp; using OpenVinoSharp; using System; using System.Windows.Forms;namespace HelloPPHuman {public partial class Form1 : Form{public Form1(){InitializeCo…

四、Scala深入面向对象:类、对象与伴生关系

在前几节中&#xff0c;我们学习了 Scala 的基础语法和流程控制。现在&#xff0c;我们将深入探索 Scala 作为一门纯粹的面向对象语言的核心。在 Scala 中&#xff0c;万物皆对象&#xff0c;没有像 Java 那样的原始类型和静态成员的区分。本节将重点介绍如何定义对象的蓝图&am…

【大语言模型 58】分布式文件系统:训练数据高效存储

分布式文件系统&#xff1a;训练数据高效存储 关键词&#xff1a;分布式文件系统、HDFS、Lustre、GlusterFS、数据本地性、I/O优化、存储架构、大数据存储、训练数据管理、存储性能调优 摘要&#xff1a;本文深入探讨大语言模型训练中的分布式文件系统技术&#xff0c;从存储架…

【科研绘图系列】R语言绘制散点图以及线性回归拟合曲线图

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍 加载R包 数据下载 函数 导入数据 数据预处理 画图 总结 系统信息 介绍 数据导入 代码的开始部分涉及多个数据集的导入,这些数据集涵盖了不同类型的生态学数据,包括实验室培养…

SQL 数据库操作语言详解

1. SQL 语言概述SQL&#xff08;Structured Query Language&#xff09;是用于管理关系型数据库的标准语言&#xff0c;主要分为以下几个子语言&#xff1a;- DQL&#xff08;数据查询语言&#xff09;&#xff1a;SELECT - 用于数据查询 - DML&#xff08;数据操作语言&#x…

积分变换的前世今生

积分变换常应用于解微分方程微分方程的解法&#xff1a;时域经典法&#xff1b;频域变换法&#xff1b;“积分变换”最初并不是为了解微分方程&#xff0c;而是出于更“纯粹”的数学动机——理解函数的结构、求解代数或几何问题&#xff0c;以及简化复杂的积分运算。微分方程的…

《Linux——gflags》

一、什么是gflags&#xff1f; gflags 是一个由 Google 开发的命令行参数解析库&#xff0c;主要用于在 C&#xff08;也支持其他语言&#xff09;程序中便捷地处理命令行参数。它的核心作用是帮助开发者快速定义、解析和使用命令行选项&#xff0c;避免手动编写繁琐的参数解析…

编译器的前端中端和后端

前面说的词法分析和语法分析&#xff0c;确实是编译器前端 (Front End) 最核心的两个部分。但前端的工作还没有结束。编译器各阶段划分 一个完整的编译器通常可以分为三个部分&#xff1a;前端、中端 (Middle End)、后端 (Back End)。 前端 (Front End) 核心职责: 理解源代码。…

黑马Java进阶教程,全面剖析Java多线程编程,并发和并行,笔记02

黑马Java进阶教程&#xff0c;全面剖析Java多线程编程&#xff0c;并发和并行&#xff0c;笔记02 一、并发和并行 并发&#xff1a;在同一时刻&#xff0c;有多个指令在单个CPU上交替执行 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CPU上同时执行 二、为什么有…

20250908 背包DP总结

引子 ~ 我们都有一个家&#xff0c;名字叫背包 ~ 背包DP 顾名思义&#xff0c;背包DP是用来解决背包最值问题的。题目会给出背包的容量&#xff0c;以及几个物品的属性&#xff0c;比如重量&#xff0c;价值&#xff0c;限额等等&#xff0c;具体是什么看题目。 01背包 01…

Redis持久化之RDB:快照机制原理、配置与最佳实践

Redis持久化之RDB&#xff1a;快照机制原理、配置与最佳实践 1. RDB持久化概述 1.1 什么是RDB RDB&#xff08;Redis Database&#xff09;是Redis的默认持久化方式&#xff0c;它在指定的时间间隔内生成数据集的快照&#xff08;snapshot&#xff09;&#xff0c;并将快照保…

daily notes[44]

文章目录基础references基础 hello,world是几乎所有编程语言的第一例子&#xff0c;rust也不例外。但和其它语言不一样&#xff0c;Rust的源码最好拥有自己的项目目录。 $ mkdir ~/pro $ cd ~/pro $ mkdir helloWorld $ cd helloWorld源代码文件名为main.rs&#xff0c;内容如…

JavaScript对象创建方式完全指南:从原始到现代的演进之路

前言 作为一名前端开发者&#xff0c;JavaScript中对象创建是很重要。在JavaScript这门基于原型的语言中&#xff0c;对象几乎无处不在。今天&#xff0c;我将带领大家回顾JavaScript对象创建的7种方式&#xff0c;从最原始的字面量到现代的ES6 class&#xff0c;每一步演进都解…

基于单片机的无线水塔监控系统设计(论文+源码)

本设计为基于单片机的无线水塔监控系统设计&#xff0c;主要由以下几部分组成&#xff1a;均采用STC89C52RC单片机为主控&#xff1b;主机&#xff1a;NRF24L01无线通讯模块&#xff0c;1602LCD液晶显示屏。从机&#xff1a;NRF24L01无线通讯模块&#xff0c;水位传感器&#x…

凌晨0-3点不睡,你熬的不是夜,是人生!

“熬夜”这个词&#xff0c;早已成为现代生活的常态。有人为了工作加班到深夜&#xff0c;有人为了娱乐刷剧到天明&#xff0c;但你知道吗&#xff1f;熬夜最“要命”的时间段&#xff0c;其实是凌晨0点到凌晨3点。别以为只是少睡几个小时而已&#xff0c;这个时间段不睡&#…

大语言模型基石:Transformer

一、引言 如今火爆的 GPT、LLaMA、通义千问、ChatGLM 等大语言模型&#xff0c;背后都离不开一个核心架构——Transformer。 2017 年&#xff0c;Google 在论文《Attention Is All You Need》中首次提出 Transformer 模型&#xff0c;彻底改变了自然语言处理的发展方向。它摒…