MySQL架构与数据库基础

文章目录

一、数据库概念

数据库是一个以某种由组织的方式存储的数据集合。我们可以把数据库想象称为一个文件柜。此文件柜是一个存放数据的物理位置,不管数据是什么以及如何组织的。数据库本质也需要像文件一样,能够持久化存储,故数据库存储介质为:磁盘内存

数据库database):保存有组织的数据的容器。(通常是一个文件或一组文件)

人们通常用数据库这个术语来代表他们使用误用导致混淆的数据库软件。这是不正确的,它是引起混淆的根源。确切地说,数据库软件应称为DBMS(数据库管理系统)。数据库是通过DBMS创建和操纵的容器。数据库可以是保存在硬设备上的文件,但也可以不是。在很大程度上说,数据库究竟是文件还是别的什么东西并不重要,因为我们并不直接访问数据库;我们使用的是DBMS,它替我们访问数据库。

DBMS可分为两类:一类为基于共享文件系统的DBMS,另一类为基于客户端-服务器(C/S)架构的。

MySQL、Oracle以及SQL Server等数据库是基于CS架构的数据库。这种数据库应用分为两个不同的部分。服务器部分是负责所有数据访问和处理的一个软件。这个软件运行在称为数据库服务器的计算机上。

与数据文件打交道的只有服务器软件。关于数据、数据添加、删除和数据更新的所有请求都由服务器软件完成。这些请求或更改来自运行客户机软件的计算机。客户机是与用户打交道的软件。例如,如果请求一个按字母顺序列出的产品表,则客户机软件通过网络提交该请求给服务器软件。服务器软件处理这个请求,根据需要过滤、丢弃和排序数据:然后把结果送回到我们的客户机软件。

客户机和服务器软件可能安装在两台计算机或一台计算机上。不管它们在不在相同的计算机上,为进行所有数据库交互,客户机软件都要与服务器软件进行通信。

所有这些活动对用户都是透明的。数据存储在别的地方,或者数据库服务器为我们完成这个处理这一事实是隐藏的。我们不需要直接访问数据文件。事实上,多数网络的建立使用户不具有对数据的访问权,甚至不具有对存储数据的驱动器的访问权。

这样的意义何在?因为为了使用MySQL,我们需要访问运行MySQL服务器软件的计算机和发布命令到MySQL的客户机软件的计算机。

  • 服务器软件为MySQL DBMS。我们可以在本地安装的副本上运行也可以连接到运行在我们具有访问权的远程服务器上的一个副本。
  • 客户机可以是MySQL提供的工具、脚本语言(如Perl)、Web应用开发语言(如JSP和PHP)、程序设计语言(如C、C++、Java)等。
  • /usr/bin/mysql 是客户端程序,用于从命令行与MySQL数据库服务器进行交互。
  • /usr/sbin/mysqld 是服务器守护进程,用于启动和运行MySQL数据库服务器。

MySQL本质:基于C(mysql)S(mysqld)模式的一种网络服务;我们可以使用netstat -nltp查看对应端口是否有数据库服务端程序在运行。

通常,/usr/bin目录用于存放用户命令,而/usr/sbin目录则用于存放系统管理员命令。因此,mysql命令通常位于/usr/bin,而mysqld则位于/usr/sbin

MySQL客户端

  • 客户端的角色:客户端是用户与MySQL数据库交互的接口。它可以是一个命令行工具、图形用户界面(GUI)工具,或者是一个应用程序中的数据库驱动或库。
  • 常见的MySQL客户端
    • mysql:这是MySQL提供的官方命令行工具,允许用户通过终端或命令提示符直接输入SQL命令来操作数据库。
    • 图形界面工具:如MySQL Workbench、phpMyAdmin等,它们提供了更友好的用户界面来管理数据库。
    • 编程语言库:如Python的mysql-connector-pythonpymysql,Java的mysql-connector-java等,这些库允许开发者在应用程序中嵌入数据库操作代码。

MySQL服务器 (mysqld)

  • 服务器的角色mysqld是MySQL服务器进程,负责管理数据库文件、处理来自客户端的请求、执行SQL命令,并返回结果。
  • 服务器功能
    • 数据存储:将数据存储在硬盘上的文件中。
    • 数据检索:根据客户端的请求检索数据。
    • 数据更新:根据客户端的指令更新数据库中的数据。
    • 数据删除:根据客户端的指令删除数据库中的数据。
    • 安全性:管理用户权限,确保只有授权用户才能访问数据库。

客户端与服务器交互:

  • 当客户端程序(如mysql命令行工具)启动时,它会尝试连接到运行mysqld服务的服务器。
  • 连接建立后,用户可以在客户端输入SQL命令,这些命令会被发送到服务器。
  • mysqld服务器处理这些SQL命令,并将结果返回给客户端。
  • 客户端将结果显示给用户,或者根据应用程序的需要进一步处理。

例如,如果要使用mysql命令行工具,以下是一个简单的交互过程:

sh 复制代码
# 连接到MySQL服务器
mysql -u username -p
# 输入密码后,进入MySQL命令行界面
mysql> SHOW DATABASES;

在这个例子中,SHOW DATABASES;命令是由用户在mysql客户端输入的,然后这个命令被发送到mysqld服务器,服务器执行这个命令,并将数据库列表返回给客户端,客户端再将结果显示给用户。

如果需要启动或停止MySQL服务器,通常使用以下命令(可能需要root权限):

  • 启动MySQL服务器:

    bash 复制代码
    systemctl start mysqld
  • 停止MySQL服务器:

    bash 复制代码
    systemctl stop mysqld
  • 查看MySQL服务器的状态:

    bash 复制代码
    systemctl status mysqld
  • 数据库设置为开机自启动:执行下方两个命令,实现数据库服务端开机自启动并守护进程化

    bash 复制代码
    systemctl enable mysqld	#开机自启动
    systemctl daemon-reload	#进程守护进程化
  • 如果要取消开机自启动:

    shell 复制代码
    systemctl disable mysqld
  • 连接数据库服务器:

    bash 复制代码
    mysql -h 127.0.0.1 -P 3306 -u root -p

    -h-P可以省略。-h指明登录部署了mysql的服务器的主机。-P指明我们要访问的端口号。-u指明登录用户

退出:quit或者使用快捷命令:ctrl+p


二、数据库的简单概念

当我们将资料放入自己的文件柜的时候,并不是随便的将他们扔进一个抽屉就完事了,而是在文件柜中常见文件,然后把相关资料放入特定文件中。

在数据库中,这种文件称为表。表是一种结构化的文件,可用来存储某种特定的数据类型。表可以保存顾客清单、产品目录,或者其他信息等等。

table):某种特定类型数据的结构化清单。

这里关键的一点在于,存储在表中的数据是一种类型的数据或一个清单。决不应该将顾客的清单与订单的清单存储在同一个数据库表中。这样做将使以后的检索和访问很困难。应该创建两个表,每个清单一个表。

数据库中的每个表都有一个名字,用来标识自己。此名字是唯一的,这表示数据库中没有其他表具有相同的名字。

表名:表名的唯一性取决于多个因素,如数据库名和表名等的结合。也就是说,虽然在相同数据库中不能两次使用相同的表名,但在不同的数据库中可以使用相同的表名。

表由列组成。列中存储着表中某部分的信息。

column):表中的一个字段。所有表都是由一个或多个列组成的。

我们可把将数据库表想象为一个网格。网格中每一列存储着一条特定的信息。例如,在顾客表中,一个列存储着顾客编号,另一个列存储着顾客名,而地址、城市、州以及邮政编码全都存储在各自的列中。

数据库中每个列都有相应的数据类型。数据类型定义列可以存储的数据种类。例如,如果列中存储的为数字(或许是订单中的物品数),则相应的数据类型应该为数值类型。如果列中存储的是日期、文本、注释、金额等,则应该用恰当的数据类型规定出来。

数据类型datatype):所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据。

数据类型限制可存储在列中的数据种类(例如,禁止在数值字段中录入字符值)。数据类型还帮助正确地排序数据,并在优化磁盘使用方面起重要的作用。因此,在创建表时必须对数据类型给予特别的关注。

表中的数据是按行存储的,所保存的每个记录存储在自己的行内。如果将表想象成网格,其中垂直的列称为表列,水平的行称为表行。

row):表中的一个记录。

Mysql 服务端在启动时,会读取配置文件,对某些属性信息做配置。centos 7中 Mysql的配置文件为/etc/my.cnf,如下图右边所示(可修改这个文件的配置信息,对mysql做配置)。

数据库中的数据是存储在文件中的,建立不同的数据库就是建立不同的目录。创建一个数据库,就是在Linux下创建一个目录。

上图中,创建了名为 hello的数据库,并在其中建表。在数据库内建表,即在数据库所在目录下创建新文件。

上述工作都是Mysqld做的。也就是说数据库本质其实也是文件,只不过这些文件并不由程序员直接操作,而是由数据库的Mysqld服务帮我们进行操作管理。


三、SQL

SQL是结构化查询语言的缩写,Structured Query Language。它是一种专门用来与数据库通信的语言。几乎所有重要的DBMS都支持SQL。即主要用于管理关系数据库系统、处理数据以及在数据库中进行各种操作。SQL语句分为以下四类:

  1. DDL (Data Definition Language ):数据定义语言用于定义数据库的结构,包括创建、修改和删除数据库中的对象,如数据库、表、视图、索引等。常见的DDL命令包括:
    • CREATE:创建新的数据库对象,如表、视图或索引。
    • ALTER:修改现有数据库对象。
    • DROP:删除数据库对象。
  2. DML (Data Manipulation Language ):数据操作语言用于在数据库中插入、更新、删除和查询数据。DML命令通常涉及对表中的数据进行操作。常见的DML命令包括:
    • INSERT:向表中添加新行(记录)。
    • UPDATE:修改表中现有行的数据。
    • DELETE:从表中删除行。
  3. DQL (Data Query Language ):数据查询语言通常被认为是SQL的一个子集,专门用于从数据库中检索数据。最常用的DQL命令是:
    • SELECT:从数据库中的一个或多个表中检索数据。
  4. DCL (Data Control Language ):数据控制语言用于管理数据库中的数据访问权限。DCL命令通常用于创建和撤销用户权限、角色以及事务控制。常见的DCL命令包括:
    • GRANT:授予权限。
    • REVOKE:撤销权限。

这些SQL部分共同构成了数据库管理的关键工具集,使得用户和开发者能够有效地与数据库交互。


四、MySQL架构

MySQL 架构描述了 MySQL 系统的不同组件如何相互关联。 MySQL 架构基本上是一个客户端-服务器系统。 MySQL数据库服务器是服务器,连接到MySQL数据库服务器的应用程序是客户端。 MySQL架构包含以下主要组件:

上图展示了MySQL服务器的架构:

  1. Client Connectors (客户端连接器)

    • 这一层负责与客户端进行通信。MySQL支持多种连接器,如JDBC、ODBC、.NET、PHP、Python和C API。这些连接器允许不同语言的应用程序与MySQL服务器进行交互。
  2. MySQL Server (MySQL服务器)

    • 这是整个架构的核心部分,包含多个子系统和模块。

    • Connection Pool (连接池)

      • 负责处理客户端连接、身份验证以及安全性管理。连接池优化了连接的复用,减少了每次连接时的资源消耗。
    • Services & Utilities (服务和实用工具)

      • 包括备份与恢复、安全性、复制、分区、集群和Workbench工具。这些服务和工具为MySQL的管理和维护提供了支持。
    • SQL Interface (SQL接口)

      • 处理DML(数据操作语言)、DDL(数据定义语言)、存储过程、触发器和视图等SQL操作,是用户与数据库交互的主要接口。
    • Parser (解析器)

      • 负责对SQL语句进行词法和语法分析,并生成相应的语法树和代码。
    • Optimizer (优化器)

      • 负责SQL查询的优化,包括查询重写、扫描顺序以及索引的使用。这一步骤是提高查询性能的关键。
    • Caches (缓存)

      • 包含全局缓存和引擎特定的缓存,用于提高数据读取的速度,减少对磁盘的访问。
  3. Pluggable Storage Engines (可插拔存储引擎)

    • MySQL支持多种存储引擎,如MyISAM、InnoDB、Federated、Archive、Merge、Memory、Cluster和Example。每种存储引擎都有自己的特点,适合不同的应用场景。例如,InnoDB支持事务和外键,而Memory引擎适合需要快速访问的临时数据。
  4. Indexes (索引)

    • 索引用于加速数据检索,减少查询时间。不同的存储引擎可能有不同的索引类型和实现方式。
  5. File System & Logs (文件系统与日志)

    • 数据库数据最终存储在底层的文件系统中,如NTFS、ext4、SAN和NAS。日志文件(如二进制日志、错误日志、慢查询日志、通用日志等)则用于记录数据库的运行状态和历史操作,帮助管理员进行审计和故障排查。

整体来看,MySQL的架构设计灵活且模块化,能够根据不同的需求进行定制和优化。

相关推荐
Hacker_LaoYi31 分钟前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀32 分钟前
Redis梳理
数据库·redis·缓存
独行soc33 分钟前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天1 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺1 小时前
分布式系统架构:服务容错
数据库·架构
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain3 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship3 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站3 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle