目录
引言
一、数据库的基本概念
(一)数据、表与数据库
1.数据(Data)
2.表
3.数据库
(二)数据库管理系统
(三)数据库系统
二、数据库的发展
三、主流数据库的介绍
(一)关系型数据库
(二)非关系型数据库
(三)关系与非关系型的区别
四、MySQL数据库介绍
五、MySQL的安装
引言
数据库作为一种系统化的数据存储、管理和检索的软件,已成为我们日常生活和工作中不可或缺的一部分,无论是电子商务网站、社交媒体平台,还是企业内部的各种信息系统,背后都有数据库的身影
一、数据库的基本概念
(一)数据、表与数据库
1.数据(Data)
描述事物的符号记录
包括数字,文字、图形、图像、声音、档案记录等数据库
2.表
将不同的记录组织在一起
用来存储具体数据存放信息的集合,类似于EXCEL表格一样
姓名 | 出生年月 |
张三 | 2000-01-05 |
李四 | 1998-07-28 |
3.数据库
表的集合,是存储数据的仓库
以一定的组织方式存储的相互有关的数据集合
(二)数据库管理系统
我们的生活中无时无刻都在接触到数据,而数据库便是通过指定的组织结构将这数据存储的仓库,并且随着互联网和信息技术的发展,数据库也已经从最初只能存储简单表格发展到了存储海量数据的大型分布式模式。在信息化社会,充分有效地管理和利用各类信息资源,是进行科学研究和决策管理的前提条件。
数据库技术是管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。
数据库管理系统(即 DatabaseManagementSystem)是一种能够对数据库进行建立、使用和维护的软件程序,数据库管理系统通过将计算机中具体的物理数据转换成适合用户理解的抽象逻辑数据,方便用户维护数据库的安全和可用性。
DBMS的工作模式如下:
1.接受应用程序的数据请求和处理请求
2.将用户的数据请求(高级指令)转换为复杂机器代码(底层指令)
3.实现对数据库的操作
4.从数据库的操作中接受查询结果
5.对查询结果进行处理(格式转换)
6.将处理结果返回给用户
(三)数据库系统
是一个人机系统,由硬件、OS、数据库、DBMS、应用软件和数据库用户组成。用户可以通过DBMS或应用程序操作数据库
数据库管理员(DatabaseAdministrator,DBA)
负责数据库的更新和备份、数据库系统的维护、用户管理等工作,保证数据库系统的正常运行。DBA 一般由业务水平较高、资历较深的人员担任。
二、数据库的发展
数据库的发展历史可以追溯到20世纪60年代,经历了几个重要阶段和技术革新。以下是详细介绍:
第一代数据库系统主要基于网状数据模型和层次数据模型。网状数据库模型于1964年诞生,它将数据从应用程序中独立出来并进行集中管理,能反映现实世界中信息的关联。层次数据库则采用树结构,解决了集中存储、管理和共享数据的问题,但数据独立性和抽象级别存在不足。236
第二代数据库系统以关系数据模型为代表,于1970年出现。关系数据库系统基于表格型数据,通过结构化查询语言(SQL)提供定义、操纵、查询和控制功能。1974年,IBM发布了第一个商用关系数据库系统IMS,随后,关系数据库系统得到了广泛的应用和推广。
第三代数据库系统则以面向对象模型为主要特征,产生于20世纪80年代。这一代数据库系统支持多种数据模型,并结合了新技术,如分布式处理、并行计算、人工智能等,广泛应用于商业管理、地理信息系统(GLS)、计划统计等多个领域。
此外,随着云计算技术的发展,数据库系统也逐渐向云上转移,出现了云数据库的概念。云数据库通过计算机网络提供数据管理服务,具有部署和虚拟化在“云端”的特点。同时,数据库技术也呈现出多元化的趋势,非关系型数据库如NoSQL数据库因其能适应更多应用场景而得到发展。此外,数据库管理系统(DBMS)的核心组件集一般可以分为管理组件、网络组件、计算组件、存储组件四大模块。
三、主流数据库的介绍
主流的数据库系统包括关系型数据库和非关系型数据库两大类
(一)关系型数据库
关系型数据库(Relational Database Management System, RDBMS)是一种基于关系模型理论的数据库管理系统。关系模型由英国计算机科学家艾伦·科德在1970年提出,其核心思想是将数据组织成一系列二维表格(关系)的形式,并通过表格之间的关联关系来描述和操作数据。
关系数据库系统是基于关系模型的数据库系统,关系模型的数据结构使用简单易懂的二维数据表
,可用简单的“实体-关系”(E-R)图来表示
E-R图中包含了关系、实体(数据对象)、和属性三个要素
实体:也称为实例,对应现实世界中可区别于其他对象的“事件”邻事物'。
属性:实体所具有的某一特性,一个实体可以有多个属性
联系:实体集之间的对应关系称为联系,也称为关系。
所有实体及实体之间联系的集合构成一个关系数据库
通过上图可以看到,关系表中存放着其它表与表之间的对应关系,如用户名编号为1的张三用户,他的账号和密码对应的是账号表中的编号3
关系数据库的存储结构是二维表格
每个二维表中
每一行称为一条记录,用来描述一个对象的信息
每一列称为一个字段,用来描述对象的一个属性
简单来说,行加列就是一个二维表
优点:
1.使用表存储数据,格式统一,便于维护
2.使用SQL语言操作,标准统一,使用方便
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
常见的关系型数据库
MySQL:开源的关系型数据库管理系统,由 Oracle 公司维护,非常适合 Web 应用程序,以其灵活性和高性能著称。
Oracle Database:由甲骨文公司开发,广泛应用于企业级应用,提供高度可伸缩性和安全性。
Microsoft SQL Server:由微软公司开发,适合于 Windows 环境,且在 Azure 上有良好的云支持。
PostgreSQL:开源对象关系数据库系统,支持丰富的数据类型和索引,具有强大的功能和稳定性。
IBM Db2:IBM 公司出品的关系型数据库,针对大型企业级应用设计,支持大数据和混合云环境。
SQLite:轻量级嵌入式数据库,广泛应用于移动应用和桌面应用。
MariaDB:MySQL 的一个分支,也是一个开源的关系型数据库,兼容 MySQL,同时提供了一些增强特性和改进
(二)非关系型数据库
非关系型数据库(Non-relational Database,也称NoSQL数据库)是一种不同于传统关系型数据库的数据存储系统,它不采用关系模型和SQL语言,而是采用其他数据模型和查询语言来存储和检索数据。非关系型数据库的主要特点在于其灵活的数据模型、高可扩展性和分布式存储的能力,以适应互联网时代的大规模、高速和多样化的数据处理需求。
主要特点:
数据模型多样性:
键值存储(Key-Value Store):如Redis、Amazon DynamoDB,以键值对的形式存储数据,适用于快速查找和缓存场景。
文档型数据库(Document-Oriented):如MongoDB、Couchbase,以JSON、XML等文档形式存储数据,每个文档都可以拥有独特的结构。
列族存储(Column Family):如Apache Cassandra、HBase,数据按列族存储,同一列族内的数据具有较强的关联性,适用于大数据分析和实时查询。
图形数据库(Graph Database):如Neo4j,以节点、边和属性构成的图形模型表示数据,擅长处理复杂的关系网络数据。
-
弱一致性:非关系型数据库倾向于牺牲强一致性(ACID)以换取更高的可用性和扩展性,通常采用CAP定理中的CP/AP模型。
-
水平扩展:非关系型数据库通过分布式架构和数据分区技术实现水平扩展,能够在多台服务器上分散数据存储和处理负载,以应对大规模并发访问和数据增长。
-
灵活的数据结构:非关系型数据库允许数据结构在运行时动态变化,无需预先定义严格的数据表结构。
使用场景:
- 实时数据处理:对实时数据进行快速写入和查询,如日志记录、点击流分析。
- 大数据处理:处理PB级别数据,提供大数据存储和分析能力。
- 高并发场景:在高并发访问的情况下,能够提供高可用性和低延迟的读写服务。
- 内容管理系统:文档型数据库适合存储和检索带有复杂结构的内容信息。
- 社交网络:图形数据库在处理用户之间的社交关系时效果尤为突出。
非关系型数据库已经成为现代IT架构中的重要组成部分,与关系型数据库互补,共同支撑各类业务场景的数据存储和处理需求。
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。
4、好多数据写在内存中
常见的非关系型数据库
MongoDB:流行的开源文档型数据库,采用 JSON 格式的文档存储数据。
Cassandra:由 Apache 基金会开发的分布式列族数据库,适用于大规模分布式环境。
Redis:内存中数据结构存储系统,也支持持久化,常用于缓存和实时数据存储。
Apache HBase:基于 Google Bigtable 设计的分布式列式数据库,运行在 Hadoop 生态系统之上。
Amazon DynamoDB:亚马逊提供的完全托管的 NoSQL 数据库服务,专为可扩展性和高吞吐量设计。
Elasticsearch:开源搜索引擎,基于 Lucene,提供分布式全文搜索和分析功能。
(三)关系与非关系型的区别
关系型数据库(Relational Database)和非关系型数据库(NoSQL Database)在数据存储、组织、查询和扩展性等方面具有显著的区别:
1.数据结构与模型
关系型数据库:基于关系模型理论,数据以表格形式存储,每个表格由行和列组成,且表格之间通过主键和外键建立关系,形成一个严格的二维表格体系。关系型数据库遵循ACID(原子性、一致性、隔离性、持久性)原则。
非关系型数据库:又称为NoSQL数据库,数据可以以多种形式存储,包括但不限于文档型、键值对、列族存储和图形数据库。非关系型数据库不要求固定的表结构和关系,支持灵活的数据模型,强调水平扩展和高性能读写。
2.数据一致性:
关系型数据库:通常提供强一致性的保证,通过事务处理确保数据完整性,遵循严格的数据约束
非关系型数据库:在很多情况下提供的是最终一致性,牺牲部分一致性以换取更高的可用性和扩展性,特别是在分布式环境下,不同的NoSQL数据库对数据一致性的保证程度各异。
3.查询语言
关系型数据库:使用结构化查询语言(SQL)进行数据操作,SQL是一种标准化的语言,提供了丰富的查询、更新和管理数据的手段。
非关系型数据库:没有统一的查询语言,各具特色的查询方式。例如,MongoDB使用MongoDB Query Language(MQL),Cassandra使用CQL(Cassandra查询语言),键值存储一般使用简单的GET/PUT操作。
4.扩展性
关系型数据库:传统关系型数据库通过垂直扩展(增加单台服务器的硬件资源)来应对性能需求的增长,现代关系型数据库也开始支持水平扩展(通过集群和分区),但扩展性相比非关系型数据库略显受限。
非关系型数据库:天生支持水平扩展,设计之初就考虑到分布式环境下的数据存储和处理,可通过增加更多服务器节点来分散数据和负载,具有较好的水平扩展能力。
5.数据冗余与JOIN操作
关系型数据库:通过JOIN操作关联不同表中的数据,数据可能存在一定程度的冗余以优化查询性能,但也可能导致数据一致性问题。
非关系型数据库:通常不支持JOIN操作,数据冗余程度取决于数据模型的设计,有的NoSQL数据库通过嵌套数据或引用避免JOIN,有些则允许适度冗余以加速查询。
6.数据存储位置
关系型数据库:将数据写到磁盘当中,读写系统会受到磁盘IO限制或瓶颈
非关系型数据库:将数据存到内存当中
7.适用场景
关系型数据库:适用于对事务性要求较高、数据结构固定且关系复杂的应用场景,如金融、电商后台系统等。
非关系型数据库:适用于处理大量非结构化或半结构化数据、需要高并发读写、对扩展性要求较高的场景,如社交网络、物联网、实时分析等领域
四、MySQL数据库介绍
MySQL是一款广泛使用、开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,后被Sun Microsystems收购,现属于Oracle公司。MySQL以其高效、稳定、易于使用和成本低廉的特点,在全球范围内受到了广大开发者的青睐,尤其在Web应用开发中占据主导地位。
MySQL数据库主要特点包括:
-
开源免费:MySQL遵循GPL协议,用户可以免费下载、使用和修改源代码,这对于企业和个人开发者来说大大降低了成本。
-
高性能:MySQL经过精心设计,提供了极佳的查询性能,支持索引、查询优化器、缓存机制等功能,能够处理大量并发连接和数据量。
-
完备的SQL支持:MySQL支持标准SQL语法,同时也提供了一些扩展功能,可以根据需求定制SQL查询。
-
可移植性强:MySQL可在多种操作系统平台上运行,包括Windows、Linux、macOS以及其他类Unix系统。
-
安全性:MySQL提供了多种安全措施,包括用户权限管理、SSL加密连接、密码复杂度校验等功能,以保护数据库中的数据安全。
-
高可用性和可扩展性:MySQL支持主从复制、集群(如MySQL Cluster、MySQL Fabric)、分区表等技术,以实现高可用性和大规模数据处理能力。
-
多种存储引擎:MySQL支持多种存储引擎,如InnoDB(支持事务处理和行级锁定)、MyISAM(读密集型场景)、MEMORY(数据存储在内存中)等,可根据实际应用场景选择合适的存储引擎。
-
社区活跃:MySQL拥有庞大的开发者社区,有许多第三方插件、工具和教程,为开发者提供丰富的技术支持和解决方案。
MySQL已被广泛应用于Web应用、移动应用、数据分析、云计算等多个领域,是LAMP(Linux、Apache、MySQL、PHP/Perl/Python)开源技术栈的重要组成部分
五、MySQL的安装
MySQL的安装方式有三种
yum安装
优点:安装速度快,自动生成配置文件与程序用户
缺点:centos自带版本较低,需要搭建yum仓库,一般企业不推荐使用yum安装
编译安装
优点:安全,可以自己选择安装版本,功能齐全
缺点:编译文件多,速度较慢
二进制安装
优点:速度快,效率高
缺点:二进制包文件较大,下载缓慢,且有漏洞。
一般推荐使用编译安装的
1.安装Mysql环境依赖包
2.创建程序用户管理
3.准备好源码包,并解压
注意:这里准备的是mysql与boost的集成包
4.执行cmake命令进行编译
注意:在指定-DWITH_BOOST=boost时,由于本次安装使用的是mysql-boost集成包安装,直接指明boost即可,如分开安装,则需要指明路径,如-DWITH_BOOST=/usr/local/boost。
5.执行make && make install进行编译安装
注意:此过程较为缓慢,可以调用所有CPU一起加快编译速度,make -j cpu核数
例如make -j 4 就是调用4核cpu一起编译
6.更改管理主/组
7.修改配置文件
8.设置环境变量,申明/宣告mysql命令便于系统识别
9.初始化数据库
10.建立service文件
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
11.启动服务
准备好压缩包,放在/opt目录下 mysql-boost-5.7.20.tar.gz
1.安装Mysql环境依赖包
yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake
gcc
gcc-c++
ncurses #字符终端下图形互动功能的动态库
ncurses-devel #ncurses开发包
bison #语法分析器
cmake #mysql需要用cmake编译安装
2.创建程序用户管理
useradd -s /sbin/nologin mysql3.解压源码包
tar zxf mysql-boost-5.7.20.tar.gz -C /opt
4.执行cmake命令进行编译
cd /opt/mysql-5.7.20/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #指定mysql的安装路径
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ #指定mysql进程监听套接字文件(数据库连接文件)的存储路径
-DSYSCONFDIR=/etc \ #指定配置文件的存储路径
-DSYSTEMD_PID_DIR=/usr/local/mysql \ #指定进程文件的存储路径
-DDEFAULT_CHARSET=utf8 \ #指定默认使用的字符集编码,如 utf8
-DDEFAULT_COLLATION=utf8_general_ci \ #指定默认使用的字符集校对规则
-DWITH_EXTRA_CHARSETS=all \ #指定支持其他字符集编码
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #安装INNOBASE存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ #安装ARCHIVE存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ #安装BLACKHOLE存储引擎
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ #安装FEDERATED存储引擎
-DMYSQL_DATADIR=/usr/local/mysql/data \ #指定数据库文件的存储路径-DWITH_BOOST=boost
#使用mysql-boost集成包安装直接指明boost,如分开安装,则需要指明路径,
#如-DWITH_BOOST=/usr/local/boost
-DWITH_SYSTEMD=1 #生成便于systemctl管理的文件5.make && make install
注意:如果在CMAKE的过程中有报错,当报错解决后,需要把源码目录中的CMakeCache.txt文件删除,然后再重新CMAKE,否则错误依旧
6.更改管理主/组
chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf
7.修改配置文件
vim /etc/my.cnf #删除原配置项,再重新添加下面内容
[client] #客户端设置
port = 3306
socket=/usr/local/mysql/mysql.sock[mysqld] #服务全局设置
user = mysql #设置管理用户
basedir=/usr/local/mysql #指定数据库的安装目录
datadir=/usr/local/mysql/data #指定数据库文件的存储路径
port = 3306 #指定端口
character-set-server=utf8 #设置服务器字符集编码格式为utf8
pid-file = /usr/local/mysql/mysqld.pid #指定pid 进程文件路径
socket=/usr/local/mysql/mysql.sock #指定数据库连接文件
bind-address = 0.0.0.0 #设置监听地址,0.0.0.0代表允许所有,如允许多个IP需空格隔开
skip-name-resolve #禁用DNS解析
max_connections=2048 #设置mysql的最大连接数
default-storage-engine=INNODB #指定默认存储引擎
max_allowed_packet=16M #设置数据库接收的数据包大小的最大值
server-id = 1 #指定服务ID号
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,
NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
sql_mode常用值如下:
NO_ENGINE_SUBSTITUTION
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常STRICT_TRANS_TABLES
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制NO_AUTO_CREATE_USER
禁正GRANT创建密码为空的用户NO_AUTO_VALUE_ON_ZERO
mysql中的自增长列可以从O开始。默认情况下自增长列是从1开始的,如果你插入值为0的数据会报错NO_ZERO_IN_DATE
不允许日期和月份为零NO_ZERO_DATE
mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告ERROR_FOR_DIVISION_BY_ZERO
在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。默认情况下数据被零除时MysQL返回NULLPIPES_As_CONCAT
将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似ANSI_QUOTES
启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
8.设置环境变量,申明/宣告mysql命令便于系统识别
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
9.初始化数据库
cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \ #生成初始化密码为空
--user=mysql \ #指定管理用户
--basedir=/usr/local/mysql \ #指定数据库的安装目录
--datadir=/usr/local/mysql/data #指定数据库文件的存储路径
10.建立service文件
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload #刷新识别
systemctl enable --now mysqld #开机自启并立即启动