数据库概念
什么是数据库
数据库见名之意,就是用来存储数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
没接触数据库之前,一般都是将数据存储在文件中。比如execl文件,word文件中。但是用文件保存数据对比数据库保存数据,文件保存数据存在以下几个缺点:
- 文件的安全问题
- 文件不利于数据查询和管理
- 文件不利于处理海量数据
- 文件在程序中控制不方便
总的来说数据库相比文件更适合于处理复杂的、多用户访问的数据,并且能够提供更高的安全性、性能和灵活性。
为了解决这个问题,大佬们就设计出了一种更加利于管理数据的东西->数据库。它能更能高效的管理数据。
主流的数据库
- MySQL: MySQL 是一个流行的开源关系型数据库管理系统,广泛应用于 Web 应用程序和企业级解决方案中。
- Oracle Database: Oracle Database 是一个功能强大的商业关系型数据库管理系统,适用于大型企业级应用。
- Microsoft SQL Server: Microsoft SQL Server 是由微软开发的关系型数据库管理系统,适用于 Windows 平台,广泛用于企业级解决方案。
- PostgreSQL: PostgreSQL 是一个强大的开源关系型数据库管理系统,具有高度可定制性和扩展性。
- MongoDB: MongoDB 是一个流行的开源非关系型数据库管理系统,采用文档存储模型,适用于大规模的数据存储和处理。
- SQLite: SQLite 是一个轻量级的嵌入式关系型数据库管理系统,适用于移动应用程序和小型设备。
- IBM Db2: IBM Db2 是一个功能丰富的商业关系型数据库管理系统,适用于企业级应用和大型数据处理。
- Amazon Aurora: Amazon Aurora 是亚马逊提供的关系型数据库服务,兼具高性能、可扩展性和可用性。
这些数据库各自有其特点和适用场景,选择合适的数据库取决于项目需求、性能要求、数据量、可扩展性和预算等因素。
数据库可以通过网络提供服务。数据库通常作为一个独立的软件运行在服务器上,并通过网络接口来提供对数据的访问和管理。这意味着客户端应用程序可以通过网络连接到数据库服务器,并发送查询、更新和其他操作请求,以访问或修改数据库中的数据。
数据库分为客户端和服务器两种。在本地连接数据库时,一般会使用下面的命令:mysql -uroot -p
输入密码后,就可以连接到本地数据库了。这种没有指定远程ip地址和端口号,默认就是连接本地回环地址127.0.0.1和默认端口3306的。
如果要连接远程数据库,则需要指定ip地址和端口号mysql -h 127.0.0.1 -P 3306 -u root -p
。
- h: 表示你要连接的MySQL服务器所在的主机,127.0.0.1表示本主机。
- P: 表示你要连接的MySQL服务器所对应的端口号,一般默认是3306。
- u: 表示用哪一个用户连接MySQL服务器,root表示超级用户。
- p: 表示该用户对应的密码,密码可以直接跟在-p后面,也可以回车后输入。
注意,要连接远程MySql服务,本地MySql客户端和服务器MySql版本要一致。
在服务器上使用ps命令就能查看到mysqld进程信息。mysqld就是服务器上为mysql提供服务的进程。
使用netstat
也能查看到mysqld进程处于LISTEN状态进行监听。底层使用的协议是TCP6协议(TCP6 是指在 IPv6 网络上运行的 TCP 协议)。默认的端口是3306。
MySQL服务器本质是一个网络服务器,我们使用mysql命令连接MySQL服务器时,本质就是MySQL客户端在向服务器mysqld进程发起连接请求,连接建立成功后MySQL客户端就会将用户输入的SQL语句发送给服务器mysql进程,之后服务器mysql进程就会根据SQL语句对数据进行对应的操作并把结果返回给客户端。
数据库存储介质
数据库存储介质通常可以分为两类:磁盘存储和内存存储。
-
磁盘存储
- 比如MySQL就是一种磁盘数据库。
-
内存存储
- 比如redis就是一种内存数据库。
-
数据库按照数据存储介质分为两类,磁盘数据库和内存数据库,其中内存数据库又称为主存数据库(Main Memory Database)。
-
磁盘数据库的数据主要存储在磁盘上,因此磁盘数据库在数据的持久化保存上有明显优势。但磁盘数据库为了提高数据的存储效率,也有自己对应的缓存机制,因此在某一个时刻之内,不一定所有数据都会被刷新到磁盘上。
-
内存数据库的数据主要存储在内存中,与磁盘数据库相比,内存数据库可以大大提高读取速度,减少数据库的访问时间。但内存数据库并非完全不使用磁盘,数据库的启动信息、初始数据等还是需要存储在磁盘上的,只是数据主要在内存中进行存储和运算。
-
由于内存数据库的数据存储在内存中,数据库主机掉电后数据就会丢失,因此在数据库服务关闭前通常需要把内存中的数据转储到磁盘上,甚至在内存数据库运行期间,一些数据也会持久化到磁盘存储。
服务器,数据库,表的关系
- 所谓的安装数据库服务器就是在服务器上安装了一个数据库管理程序,这个程序可以管理多个数据库。一般的开发会针对每个要开发的程序创建一个数据库。
- 保存应用中的实体数据,一般会在数据库中创建多个表,用来保存程序中的数据。
- 而所谓的建库,就是服务器上mysqld进程在其目录下创建一个目录,建表就是在目录下创建一个文件。
在mysql 中使用show global variables like "%datadir%";
命令查看存储路径(这里是Linux系统,window下也是一样的)。
使用create database
创建数据库,就会在存储路径/var/lib/mysql/
下新建一个目录
新建好的库中,默认有一个db.opt文件。该文件中指明了当前数据库的默认字符编码和字符校验规则
这里的字符编码和校验规则都是UTF-8。一般情况下,如果没有特殊的需求,这个文件不需要手动编辑或创建。
在库中创建表就是在对应的目录下创建文件
.frm
是表结构文件。 .ibd
是表数据和索引的文件。
SQL分类
SQL(Structured Query Language,结构化查询语言)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
- DDL(Data Definition Language)数据定义语言,用来维护存储数据的结构。比如create语句、drop语句、alter语句等。
- DML(Data Manipulation Language)数据操作语言,用来对数据进行操作。比如insert语句、delete语句、update语句等。
- DML中又单独分了一个DQL(Data Query Language)数据查询语言,比如select语句、from语句、where语句等。
- DCL(Data Control Language)数据控制语言,主要负责权限管理和事务。比如grant语句、revoke语句、commit语句。
MySql架构
MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、 Mac。各种系统在底层实现方面各有不同,但是 MySQL 基本上能保证在各个平台上的物理体 系结构的一致性。
MySql架构图如下:
- 客户端连接器:它负责与服务器建立连接、发送查询请求、接收查询结果和处理与服务器的通信。MySQL 支持多种客户端连接器,其中最常见的是标准 MySQL 客户端连接器(mysql)以及各种编程语言提供的 MySQL 客户端。
- 连接池和线程管理器: MySQL 使用连接池和线程管理器来管理客户端连接。连接池负责管理和维护数据库连接,而线程管理器负责管理处理客户端请求的线程。
- SQL 接口: SQL 接口允许客户端通过 SQL 语句与 MySQL 服务器进行通信。客户端可以使用多种编程语言(如 PHP、Python、Java 等)提供的 API 来与 MySQL 服务器进行交互。
- 解析器和优化器: MySQL 使用解析器解析客户端发送的 SQL 语句,并将其转换为内部数据结构。优化器负责分析 SQL 查询,并生成执行计划以提高查询性能。
- 缓存管理器: MySQL 使用缓存管理器来管理查询缓存。查询缓存存储先前执行过的查询结果,以提高查询性能。
- 存储引擎: MySQL 支持多种存储引擎,包括 InnoDB、MyISAM、MEMORY、CSV 等。存储引擎负责管理数据的存储和检索,并提供不同的特性和性能优势。由多种可拔插的存储引擎共同组成,真正负责MySQL中数据的存储和提取,每个存储引擎都有自己的优点和缺陷,服务层是通过存储引擎API来与它们交互的。
MySql存储引擎
存储引擎是数据库系统中负责管理数据存储和检索的组件,它定义了数据在磁盘上的存储格式、索引方式、事务支持等特性。不同的存储引擎可以提供不同的性能、功能和特性,以满足不同的应用需求。
在 MySQL 中,常见的存储引擎包括但不限于:
- InnoDB: InnoDB 是 MySQL 默认的存储引擎,它提供了事务支持、行级锁、外键约束、崩溃恢复等功能,适合于需要高并发和事务支持的应用场景。
- MyISAM: MyISAM 是 MySQL 中另一个常见的存储引擎,它不支持事务和行级锁,但提供了全文索引、压缩表格等特性,适合于读操作较多的应用场景。
- MEMORY: MEMORY 存储引擎将数据存储在内存中,速度非常快,但数据在 MySQL 服务器关闭时会丢失,适合于临时数据存储和高速缓存。
- CSV: CSV 存储引擎将数据以 CSV 格式存储在文件中,适合于导入和导出数据。
- Archive: Archive 存储引擎提供了高度压缩的存储格式,适合于存储大量历史数据。
- NDB Cluster: NDB Cluster 存储引擎用于 MySQL Cluster,提供了分布式存储和高可用性特性,适合于大规模、高可用的分布式应用
使用show engines
可以查看MySql支持的存储引擎。
MySql默认使用的是InnoDB存储引擎。该存储引擎支持事务、行级锁、外键等。