数据库是按照数据结构来组织、存储和管理数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
虽然单纯的使用文件也可以存储数据,但会存在如下缺点:
为了解决上述问题,于是专家们设计出了更利于管理数据的数据库。
客户端 VS 服务器
数据库是分为数据库服务器和数据库客户端的,以MySQL数据库为例,我们使用MySQL数据库时会先通过mysql命令连接MySQL服务器。如下:
这里我们使用的mysql命令就是MySQL的客户端,而MySQL服务器可以通过ps命令进行查看。如下:
这里查看到的mysqld就是MySQL的服务器,我们使用mysql命令实际就是在连接mysqld服务。通过netstat命令可以看到,MySQL服务器底层采用的是TCP6协议,目前服务器处于监听状态。如下:
也就是说,MySQL服务器本质是一个网络服务器,我们使用mysql命令连接MySQL服务器时,本质就是MySQL客户端在向MySQL服务器发起连接请求,连接建立成功后MySQL客户端就会将用户输入的SQL语句发送给MySQL服务器,之后MySQL服务器就会根据SQL语句对数据进行对应的操作。
数据库的存储介质
数据库的存储介质有以下两种:
说明一下:
主流数据库
下面列举了几个主流的数据库:
连接服务器
连接MySQL服务器的方式如下:
解释说明:
此外,如果要连接的是本地的MySQL服务器,那么连接时只需要指明用户名和用户密码即可。如下:
连接到MySQL服务器后,就可以输入各种SQL语句让服务器执行了,当要退出mysql时直接输入quit
或exit
或\q
即可。如下:
停止服务器
通过systemctl stop mysqld
命令或service mysqld stop
命令可以停止MySQL服务器。比如:
启动服务器
通过systemctl start mysqld
命令或service mysqld start
命令可以启动MySQL服务器。比如:
重启服务器
通过systemctl restart mysqld
命令或service mysqld restart
命令可以重启MySQL服务器。比如:
数据库服务器、数据库和表的关系如下:
说明一下:
数据存储路径
通过MySQL创建的数据库和各种表结构,最终会以文件的形式存储下来,通过查看MySQL的配置文件中的datadir可以得知数据文件的存储路径。
比如我的MySQL配置文件的绝对路径为/etc/my.cnf
,配置文件中datadir对应的值为/var/lib/mysql
。如下:
将来MySQL创建的数据库文件都会存储在该目录下,可以看到该目录下有很多MySQL相关的数据文件。如下:
创建数据库
连接MySQL服务器后,通过create语句创建一个名为helloworld的数据库。比如:
这时/var/lib/mysql
目录下,就会多出一个名为helloworld的目录。如下:
目前helloworld目录下只有一个名为的db.opt的文件,该文件中指明了当前数据库的默认字符编码和字符校验规则。如下:
因此我们创建数据库时,本质就是在MySQL的数据存储路径下新建了一个目录,而当我们将这个数据库删除后,这个目录其实也就不存在了。比如:
此时在MySQL的数据存储路径下的helloworld目录也就不存在了,因此删除数据库本质就是删除数据存储路径下对应的目录。
使用数据库
使用数据库之前,可以先通过show语句查看当前都有哪些数据库,然后再通过use语句使用指定的数据库。比如:
使用数据库可以理解成,就是使用cd命令进入到该数据库对应的目录当中。
创建数据库表
这里我们通过create语句创建一个简单的student表。比如:
通过show语句可以查看创建的student表结构。比如:
由于student表采用的存储引擎是InnoDB,因此在MySQL的数据存储路径下的helloworld目录下,就会多出两个文件,分别是student.frm和student.ibd。如下:
其中student.frm是表结构文件,student.ibd是表数据和索引的文件。
如果说创建数据库的本质是在数据存储路径下新建一个目录的话,那么创建表本质实际就是在特定的数据库目录下新建若干个文件(InnoDB存储引擎对应的是两个,MyISAM存储引擎对应的是三个),因此在创建表之前一定要先选择一个数据库。
表中插入数据
通过desc语句可以查看对应的表结构。比如:
通过insert语句可以向表中插入数据。比如:
查询表中的数据
通过select语句可以查看表中的数据。比如:
数据的逻辑存储
表中的数据是以二维表格的形式进行呈现的,包括行和列。如下:
其中每一行我们称之为是一条记录,而每一列都代表一个属性(属性列)。
MySQL架构
MySQL是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如Unix/Linux、Windows、Mac和Solaris。各种系统在底层实现方面各有不同,但是MySQL基本上能保证在各个平台上的物理体系结构的一致性。
MySQL的架构设计如下:
MySQL架构主要可分为如下四层:
MySQL客户端
MySQL服务器会收到MySQL客户端发来的SQL语句,并根据SQL语句执行对应的操作。
mysql命令本质是一个可执行程序,通过file命令可以看到该可执行程序是采用动态链接的方式生成的,通过ldd命令可以看到该可执行程序依赖的C/C++库文件。如下:
也就是说,mysql命令本身就是C/C++编写的,因此在编写mysql程序时,一定需要调用MySQL提供给C/C++的语言接口客户端。当然,MySQL不仅仅提供了C/C++对应的语言接口,像Python、Java、PHP等都有对应的MySQL接口。
SQL(Structured Query Language,结构化查询语言)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL语句可分为如下三类:
说明一下: DML中又单独分了一个DQL(Data Query Language)数据查询语言,比如select语句、from语句、where语句等。
存储引擎就是数据库管理系统如何存储数据、如何为存储的数据建立索引、如何更新数据、如何查询数据等技术的实现方法,MySQL中的存储引擎是插件式的存储引擎,它可以支持多种存储引擎。
通过show语句可以查看MySQL支持的存储引擎。比如:
其中MySQL底层默认使用的存储引擎是InnoDB,该存储引擎支持事务、行级锁、外键等。
各个存储引擎对比如下:
Feature | MyISAM | BDB | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|---|
Storage Limits | No | No | Yes | 64TB | No | Yes |
Transactions(commit,rollback,etc.) | √ | √ | ||||
Locking granularity | Table | Page | Table | Row | Row | Row |
MVCC/Snapshot Read | √ | √ | √ | |||
Geospatial support | √ | |||||
B-Tree indexes | √ | √ | √ | √ | √ | |
Hash indexes | √ | √ | √ | |||
Full text search index | √ | |||||
Clustered index | √ | |||||
Data Caches | √ | √ | √ | |||
Index Caches | √ | √ | √ | √ | ||
Compressed data | √ | √ | ||||
Encrypted data(via function) | √ | √ | √ | √ | √ | √ |
Storage cost(space used) | Low | Low | N/A | High | Very Low | Low |
Memory cost | Low | Low | Medium | High | Low | High |
Bulk Insert Speed | High | High | High | Low | Very High | High |
Cluster database support | √ | |||||
Replication support | √ | √ | √ | √ | √ | √ |
Foreign key support | √ | |||||
Backup/Point-in-time recovery | √ | √ | √ | √ | √ | √ |
Query cache support | √ | √ | √ | √ | √ | √ |
Update Statistics for Data Dictionary | √ | √ | √ | √ | √ | √ |
建议记忆:InnoDB存储引擎是支持事务的,而MyISAM存储引擎是不支持的。