Welcome to 9ilk's Code World
(๑•́ ₃ •̀๑) 个人主页: 9ilk
(๑•́ ₃ •̀๑) 文章专栏: MySQL
本篇博客我们来建立一下数据库的相关概念,主要理解什么是数据库以及mysql和mysqld,MySQL架构等问题。
🏠 登录选项认识
sql
mysql -h 127.0.0.1 -P 3306 -u root -p
注:1. 如果没有写 -h 127.0.0.1 默认是连接本地。
2.如果没有写 -P 3306 默认是连接3306端口号。
我们登录时当然也可以简写成:
sql
mysql -u root -p
总结:
1 . -h 指明登陆部署了mysql服务的主机,-P指明我们要访问的端口号,-u指明登录用户,-p指明需要输入的密码。
2. 密码输入的时候是不回显的。
🏠 什么是数据库
(1) MySQL本质是一种网络服务。
- mysql是数据库服务的客户端。
2.mysqld是数据库服务的服务器端(可执行程序带d后缀的代表是守护进程)
3.MySQL本质是基于C(mysql)S(mysqld)模式的一种网络服务。
验证mysqld是服务端:
bash
netstat -lntp
//netstat -lntp 命令会列出所有处于监听状态的 TCP 端口,并且显示这些端口对应的进程信息,同时以数字形式显示地址和端口号,不进行域名解析。
我们知道端口号是用来表示一台计算机中特定进程所提供的服务。上图查询结果显示mysqld绑定了3306这个端口号,证明它是服务端。
(2)MySQL服务
Q1 : 为什么我们MySQL需要启动服务后才能用mysql连接?
因为MySQL是一种网络服务,我们可以查看它对应的端口号。
Q2 : MySQL服务是什么?
MySQL服务是一套提供数据存取服务的网络程序。
(3) 区分相关概念
- 1. 口语中数据库:在磁盘或内存中存储额特定结构与组织的数据,即在磁盘上存储的一套数据库方案(文件)。(数据库最终要么存储在磁盘要么存储在内存,我们当前只考虑磁盘,而存储在磁盘中的一组数据库文件就可以称为数据库)
- 2. 数据库服务:mysqld。
- 3. 数据库客户端:mysql。
(4) 为什么不直接用数据库存储数据而要用数据库?
- 一般的文件确实提供了数据的存储功能,但是文件并没有提供非常好的数据内容管理能力,这是站在用户角度上的。
比如:程序员对一个有上百万行内容的文件进行有效信息的提取,此时他需要打开文件,手动统计,这明显是效率低下的,文件只给我们提供基本的读写功能,但是没有提供文件内容(数据)管理功能。
文件存储还有以下缺点:
1.文件的安全性问题
2.文件不利于数据查询和管理
3.文件不利于存储海量数据
4.文件在程序中控制不方便
- 数据库本质是对数据内容存储的一套解决方案,用户给数据库提供相关字段或者要求,数据库就能根据需求进行分析,直接返回结果。这样就很好地将数据管理起来了,方便数据管理。
(5) 总结什么是数据库
1. 宏观上:数据库整体是一套对外的数据存储解决方案。由数据库客户端(mysql),数据库服务端(mysqld)以及数据库文件构成。
2.局部上:数据库是磁盘上某种提供数据存储能力的文件,它不是我们平常所说的普通文件,它有自己的内部格式,支持mysqld对其进行增删查改。
🏠 见一见数据库
样例:mysql建立一个数据库 建立一张表结构 插入一些数据 对比mysql在linux中对应是如何表现的。(简单看看)
(1) 查看数据库
sql
show databases;
(2) 建立数据库
sql
create database 数据库名; //注意以分号为结尾
创建数据库后数据库相关目录变化:
我们发现创建完helloworld数据库之后,在mysql目录下新建了helloworld目录。
结论 : 建立数据库,本质就是linux下的一个目录。
(3) 建立一张表
建立一张表之前得先选择哪个数据库,也就是相当于选择那个目录。
sql
use 数据库名称;
建立表操作:
sql
create table 表名称 (
id int,
name varchar(32),
gender varchar(2)
);
//int varchar是类型
现象:
结论 : 在数据库内创建表,本质是在Linux下新建对应文件即可。
(4) 表中插入数据
sql
insert into student (id, name, gender) values (1, '张三', '男');
insert into student (id, name, gender) values (2, '李四', '女');
insert into student (id, name, gender) values (3, '王五', '男');
(5) 表中查询数据
sql
select * from student;
Q:前面的建立数据库,建立表,查询等操作是谁帮我们做的?
mysqld服务帮我们做的。程序员通过mysql客户端,然后mysqld帮我们对数据文件实现对应要求。
结论 :数据库本质也是文件,只不过这些文件并不由我们程序员直接操作,而是数据库服务帮我们操作。
注:数据库是一种行列式结构,有自己的逻辑存储结构。
🏠 主流数据库
-
SQL Sever: 微软的产品,.Net程序员的最爱,中大型项目。
-
Oracle: 甲骨文产品,适合大型项目,复杂的业务逻辑,并发一般来说不如MySQL。
-
MySQL:世界上最受欢迎的数据库,属于甲骨文,并发性好,不适合做复杂的业务。主要用在电商,SNS,论坛。对简单的SQL处理效果好。
-
PostgreSQL :加州大学伯克利分校计算机系开发的关系型数据库,不管是私用,商用,还是学术研究使用,可以免费使用,修改和分发。
-
SQLite: 是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
-
H2: 是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中**。**
🏠 服务器数据库表之间的关系
-
所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序(mysqld) ,这个管理程序可以管理多个数据库(目录),一般开发人员会针对每一个应用创建一个数据库。
-
为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据。
-
数据库服务器、数据库和表的关系如下:
🏠 MySQL架构
MySQL 是一个可移植的数据库 ,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、Mac 和 Solaris。各种系统在底层实现方面各有不同,但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性。
-
最上面MySQL客户端,它可以是我们在Linux上命令行界面,也可以是C/C++连接,图形化界面等。
-
中间整体的MySQL SERVER主要由三部分组成:
- 第一层连接池: 用于管理客户端连接,主要用来保**存链接,鉴别用户权限以及其他安全问题,**有助于减少连接开销,提高性能。
- 第二层: 接收客户端发送的 SQL 语句,并对其进行解析,检查语法错误 ;同时会对解析后的SQL语句进行优化然后按照SQL协议传递给下一层。
- 第三层存储引擎: 存储引擎负责数据的存储、索引、事务处理等。它的作用类似驱动程序,从上层接受 转化处理后的SQL语句后,它会进行解释,真正帮我们访问表结构,数据库等。
Q:为什么第三层存在好几个存储引擎?
数据库是一套数据存取的解决方案,但是我们不可能只存单一类型的数据,我们存的数据是有种类差别的 (文档型,二进制,..),此时针对不同种类数据我们可能需要采取不同存储方案,此时效率就会有差别,因此MySQL给我们提供各种存储引擎提高效率满足上层需求。
注:MySQL是支持热插拔的,类似插件。我们需要用哪一个就把哪一个存储引擎加载到MySQL里。
总结:MySQL依旧是一个文件系统,只不过它是处于操作系统提供的文件系统之上的一套存储解决方案。
🏠 SQL语句分类
- DDL【data definition language】 数据定义语言,用来维护存储数据的结构代表指令: create, drop, alter。
- DML【data manipulation language】 数据操纵语言,用来对数据进行操作代表指令: insert,delete,update。
- DCL【Data Control Language】 数据控制语言,主要负责权限管理和事务代表指令: grant,revoke,commit。
类比数据结构链表,DDL类似定义一个链表,DML类似实现链表的头删,逆置等操作。
🏠 查看MySQL存储引擎
(1) 什么是存储引擎?
存储引擎是:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
MySQL的核心就是插件式存储引擎,支持多种存储引擎。
(2)查看存储引擎
sql
show engines;
sql
show engines \G
(3) 存储引擎对比
其中常用的存储引擎是InnoDB和MyISAM。
总结一下:
- 什么是数据库?
数据库整体是一种对外的数据存取解决方案,本质上是一种基于CS模式的网络服务。宏观上,我们把数据库理解为客户端,服务端,数据库文件这一套解决方案;局部上,我们把数据库理解为磁盘上具有特定化结构的数据库文件,支持服务端对其进行增删查改,有自己的格式。
2.如何理解mysql和mysqld,以及如何理解建立数据库和建立表?
(1) mysql是数据库的客户端,用户在客户端向服务端提出要求;mysqld是数据库服务端,根据要求对数据库文件进行操作。
(2)建立数据库本质是Linux上新建目录,而建立表本质是Linux上在对应目录新建文件。
3.MySQL整体架构?
客户端 - MySQL SERVER(连接池,中间解析层,存储引擎) - 依赖的文件系统。