数据库是什么
- 前言
- 正式开始
- 连接mysql
- 理解mysql
- 第一层理解
- 第二层理解
- 第三层理解
- 小问题
- 见见猪跑
- show databases;
- create database xxx;
- create table xxx;
- 主流数据库
- mysql架构
- SQL语句的种类
- 存储引擎
前言
你手上有没有MySQL?有了最好,没有的话建议下一个,如果你操作系统正好也是centos且没有下载的话,巧了,我上一篇刚讲了怎么下载:【MySQL】手把手教你centos7下载MySQL
正式开始
连接mysql
先不说啥,连接上MySQL的服务器:
可能你之前登录的时候没有用过这么长的选项,学过网络的同学应该看着127.0.0.1很眼熟,没学过网络的同学也没关系,好了,废话不多说。
mysql实际上是一个网络服务,因为当前是单机式访问的(下载mysq不光是一个mysql客户端,还有一个mysqld服务端),所以直接用本地回环的127.0.0.1。
-大写P是指你要访问的进程的端口号,我前一篇中配置文件中将服务器的端口号设置成3306了,所以这里想要手动知名端口号的话就是3306。
-u是指你想以什么身份登录,我这里是用root(mysql的root,不是Linux系统中的root)身份登录的,这里涉及到一点用户管理的知识,不讲的那么细了,后面会专门出一篇用户管理的博客的。
-p是登录的时候要输密码,因为我前一篇中设置配置文件的时候搞了登录不需要密码,所以这里我要不要这个选项都行,不加这个-p选项是能直接登录的:
因为前面一片本来就设置了配置文件了,所以连接的时候如果不指明-h,就会默认连接本地服务器上搭建的mysqld,-大写P去掉也是用配置文件中的3306,配置文件中可以改这个端口号,只要改了配置文件中的端口,后面访问的时候就要用修改后的端口。后面博客中也会讲mysq是可以跨网络服务的,当然跨网络就需要IP和端口了,这里用的是本地的,所以暂时不需要考虑。
简单总结一下:
-h为指明登录部署了mysql服务的主机的IP
-大P指明要访问的进程的端口号
-u指明用户类型,因为我还没有讲用户管理的博客,所以这里就暂时用root
-p也是,等讲了用户管理再说密码的事,目前先免密码登录,等到后面了必须设置密码,直的注意一点,密码输入的时候是不回显的,和Linux一样
理解mysql
第一层理解
我们下载的mysql,有两个东西非常重要,一个mysql,一个mysqld:
mysql相当于是客户端,而mysqld就相当于是服务端。
所以mysql其实是一种网络服务。
一般而言,以d结尾都是以守护进程的方式在后台运行的(我前面讲网络的时候也说过的,不懂且想了解的同学看这篇:【网络】用代码讲解协议 + 序列化和反序列化 + 守护进程 + jsoncpp)。
所以mysql本质其实是基于CS(client(mysql)-server(mysqld))模式的一种网络服务。
用netstat查看一下你起机器上的mysqld:
第二层理解
mysql是网络服务,那它提供的是什么服务呢?像抖音给我们提供的是短视频服务,mysql干啥了?
mysql是一套给我们提供数据存储服务的网络程序。
第三层理解
一般我们口语上说的数据库指的是在磁盘或者内存中存储的特定结构/组织的数据。这一点等会就体现出来了,不要急。说白话就是在磁盘上存储的一套数据库方案。
比如说在/val/lib/mysql路径下的某些文件:
这里先不说那么深。
后面为了方便各位理解,我说到数据库的时候指的是存放在磁盘上的那些文件,说数据库服务的时候是指mysqld,说数据库客户端的时候是mysql。
小问题
存储数据用文件不就行了吗?为什么还要用数据库呢?
一般的文件确实提供了数据的存储能力,但是从我们用户的角度来看,文件并没有提供非常好的数据内容管理能力。
什么叫数据内容管理能力呢?
比如说一个文件中有10万行内容,每行都是IP地址,我想让你统计一下其中以110开头的IP有多少个,以及各自是什么,这样的话,一个普通人数不得数晕过去了。
不过好在你还是一个程序员,可以通过文件读写操作来简单实现一下,但是还是要你手动写代码,比如按行读取,边度变统计判断,所以分析的过程还是要程序员自己去做。文件没有提供这样的能力,只提供了基本的读写能力,没有对内容做管理,这样如果再想要你将其中110开头的改成120呢?想让你把110开头的全部删除呢?
这种想要修改、查询、增加等对内容做操作都要程序员自己来做,不大方便。
所以这就是没有提供很好的数据管理能力。
换你,你愿意写这样的代码吗?
反正我不愿意,所以数据库本质上就是对数据内容存储的一套解决方案,用户给数据库某些字段或要求,数据库直接返回用户想要的结果就行了。
比如你给数据库说:你可以帮我把以110开头的IP给我挑出来吗?
数据库说:行,这就给你。
然后数据库帮你做这些工作,做完之后就把结果返回给你。
整个流程就是这样:
这样就不需要我们程序员自己去写这些代码了,这就是数据库存在的意义。
且文件保存数据有以下几个缺点:
- 文件的安全性问题
- 文件不利于数据查询和管理
- 文件不利于存储海量数据
- 文件在程序中控制不方便
所以什么是数据库呢?
局部来看,数据库就是给我们提供数据存储能力的文件,文件中有特定格式,可以让mysqld服务进程对其直接进行增删查改,而不是让我们程序员直接用系统级别的文件操作进行读取,太麻烦了。
整体来看,上面的整套流程就是数据库,是一套数据存储的解决方案。
数据库一般是在磁盘上存着的,但也有内存级别的数据库文件,后面博客讲的时候会遇到。
数据库的水平也是衡量一个程序员水平的重要指标之一,所以学好数据库也是很重要的。
见见猪跑
show databases;
先来简单认识一些sql语句,本篇主要是介绍一下数据库的基本概念,不会说很多的sql语句,我后面的博客再细讲这些。
首先,你可以先看看你都有啥数据库文件,用这条语句:
show databases; #记得加分号
我这里有这些,不重要,就是带你用一下这语句。
这些其实都是文件,文件肯定是要放在某些地方的,那么这些文件放在那里捏?
先看一下你的配置文件:/etc/my.cnf,用vim打开,其中有一个datadir字段:
数据库的文件就存放在这个路径下(进入这个路径要有权限),其实我前面已经演示过了。再来看一眼:
再来对比着看一下:
看见没,就是文件,不过都是目录文件。
create database xxx;
来创建一个数据库看看:
此时就是从mysql客户端向mysqld服务端下达了一个创建数据库的请求。
show一下:
再来看一下对应目录下的文件:
进入这个目录看看:
只有一个db.opt文件,就是跟数据库相关的,不用管。
那么就可以出结论了,create建议数据库,本质就是在Linux中创建一个目录。
create table xxx;
再来在刚刚创建的数据库中创建一张表,表是什么东西呢,根据名字就知道是一张表,反正就是存储数据的东西。像Excel一样。
建表之前需要选定数据库,就好比有很多目录,你想进入那一个目录做操作一样。
所以先:
use xxx;#xxx是数据库的名字
然后就可以建表了:
这里涉及到表的操作,我后面会有专门的博客再讲的,这里就先简单说一下上面的是什么意思:
其实就像Excel一样,一张表,表名字叫做student,然后第一列表示的是name,也就是学生的姓名;第二列表示的是age,也就是学生的年龄;第三列表示的是gender,也就是学生的性别。其实上面的写法也可以写在一行上,不过这样看起来更美观。
这里只是见一下猪跑,后面博客会详细讲的。
在数据库中建一张表,就相当于在对应目录下建一个文件:
可以看到新增了两个文件,先不要管这两个文件是啥,直到是帮我们建的两个文件就行。
故在数据库内建表,本质就是在Linux下创建对应的文件。可以看到这两个文件的大小,说明其中是有内容的,反正都是数据库服务器帮我们做的。
再来向表中插入一些数据:
insert into 表名字 (各个列名) values (各个列对应你想插入的数据)
如:
用下面这条语句来查看表中的所有内容:
select * from 表名字;
看:
是不是很像一个Excel表格。注意上面这张表只是逻辑存储,是想以什么样的方式呈现出来的表结构,实际存储在文件中的还是二进制。
上面这些工作都是mysql服务端帮我们做的,也就是mysqld,所以根据上面这些展示就可以知道,数据库本质也是文件,只不过这些文件并不是由我们程序员直接操作的,而是由数据库服务端帮我们做的。
好了,猪跑已经看的差不多了,更详细的等后面博客再说。下面讲点别的。
主流数据库
- SQL Sever: 微软的产品,.Net程序员的最爱,适合中大型项目。
- Oracle: 甲骨文产品,适合大型项目,复杂的业务逻辑,并发一般来说不如MySQL。
- MySQL:世界上最受欢迎的数据库,属于甲骨文,并发性好,不适合做复杂的业务。主要用在电商,SNS,论坛。对简单的SQL处理效果好。
- PostgreSQL :加州大学伯克利分校计算机系开发的关系型数据库,不管是私用,商用,还是学术研究使用,可以免费使用,修改和分发。
- SQLite: 是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
- H2: 是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。
大部分公司都选择用的是mysql,mysql虽然开源,但是并不代表其能力不强,就像Linux虽是开源的一样,但非常强。
mysql架构
MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、Mac 和 Solaris。各种系统在底层实现方面各有不同,但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性。
先看一下这张图:
其中最上层的Client Connectors:
在本篇中的体现就是命令行式的mysql,后续我也会用C++连接mysql,还有其他的图形化界面(比如Navicat)。
对于mysql服务端而言,整体的功能主要由三层构成。
第一层就是其中的Connection Pool,也就是连接池:
mysql也是网络服务,也要做好连接管理,还有权限确认的功能,所以连接管理,给用户建权以保证安全,都是在这一层做的。
第二层:
第二层主要是对sql语句做词法语法分析,必要的时候还会对语句做优化,然后交给第三层。
第三层:
匹配的是一个个的存储引擎,作用上很像驱动。
不同种类的存储引擎做不同的事情,不同的数据也是有种类差别的,有的是文档、二进制等,针对不同种类的数据,采用不同的处理方案,表现出的结果是不同的。
比如上面的MyISAM比较适合对大文本进行读取,InnoDB有很强的索引功能,可以进行快速查找。
再往下就属于文件相关的系统层了,所以说,上面所说的mysql服务的三层其实全部属于用户层,再os视角来看就属于用户进程,底层对文件进行读取的属于os。以网络的视角来看,这三层就属于应用层。
SQL语句的种类
有三类。
-
DDL【data definition language】 数据定义语言,用来维护存储数据的结构
代表指令: create, drop, alter。
⇒ 都是一些建表、修改表结构、维护存储结构的相关语句。 -
DML【data manipulation language】 数据操纵语言,用来对数据进行操作
代表指令: insert,delete,update。
DML中又单独分了一个DQL,数据查询语言,代表指令: select
⇒ 对表的内容进行操作的。 -
DCL【Data Control Language】 数据控制语言,主要负责权限管理和事务
代表指令: grant(赋权),revoke(取消权限),commit, begin。
⇒ 权限、事务管理的语句。
存储引擎
存储引擎是:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
MySQL的核心就是插件式存储引擎,支持多种存储引擎。
可以用show engines; 来查看存储引擎有哪些:
我这还有一张图:
用的最多的就两个,InnoDB和MyISAM,80%都是InnoDB,我在搞配置文件时默认的就是InnoDB。
到此结束。。。