1
数据(Data)
在计算机中描述一个事物,就需要抽取这一事物的典型特征,组成一条记录,就相当于文件里的一行内容。
数据表(Table)
分散的一条条记录需要一个高效的方式把它们组织起来,如果我们把这些记录放到同一个文件中,每行记录按逗号作为分隔,依次定义各个字段的意思,相当于定义表的标题,这样就很容易管理所有的记录了。
数据库(DataBase,简称DB)
数据库即存放数据的仓库,我们把相关的数据表放到同一个目录下,这个目录就是数据库。
数据库管理系统(DataBase Management System,简称DBMS)
有了数据、数据表、数据库的体系之后,如何科学地组织和存储数据,如何高效获取和维护数据成了关键。
这就用到了一个系统软件——数据库管理系统,如MySQL、Oracle、SQLite、Access、SQL Server
mysql主要用于大型门户,例如搜狗、新浪等,它主要的优势就是开放源代码,因为开放源代码这个数据库是免费的,他现在是甲骨文公司的产品。
oracle主要用于银行、铁路、飞机场等。该数据库功能强大,软件费用高。也是甲骨文公司的产品。
sql server是微软公司的产品,主要应用于中大型企业,如联想、方正等。
关系型数据库
采用了关系模型来组织数据的数据库。关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
优点:
缺点:
常见的关系型数据库:
1 | MySQL: 开源免费的数据库,小型的数据库。已经被Oracle收购了,MySQL6.x版本也开始收费。 |
非关系型数据库
非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。
优点
用户可以根据需要去添加自己需要的字段,为了获取用户的不同信息,不像关系型数据库中,要对多表进行关联查询。仅需要根据id取出相应的value就可以完成查询。
适用于SNS(Social Networking Services)中,例如 facebook,微博。系统的升级,功能的增加,往往意味着数据结构巨大变动,这一点关系型数据库难以应付,需要新的结构化数据存储。由于不可能用一种数据结构化存储应付所有的新的需求,因此,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
不足
从上图看MySQL服务端总体上可以分为三层:连接层、SQL层和存储引擎层
连接层
当客户端连接MySQL服务器时,最先连接处理的是连接层,连接层包括通信协议、线程处理、用户名密码认证三个部分。
通信协议负责检测客户端版本是否兼容MySQL服务端。
线程处理是指每一个连接请求都会分配一个对应的线程,相当于一条SQL对应一个线程,存储客户端与数据库的连接信息。
用户名密码认证验证创建的账号和密码,以及host主机授权是否可以连接到MySQL服务器。
SQL层
SQL层包含SQL接口、解析器、查询优化器和缓存
SQL接口负责接收客户端发送过来的各种SQL命令,并将SQL命令发送到其他部分,接收其他部分返回的结果数据返回给客户端。
解析器针对 SQL 语句进行解析,判断语法是否正确。
查询优化器对 SQL 进行改写和相应的优化,并生成最优的执行计划。
缓存存储在Query Cache中,包括MySQL的表缓存,记录缓存,MySQL中的权限缓存,引擎缓存等。MySQL中的缓存能够提高数据的查询性能,如果查询的结果能够命中缓存,则MySQL会直接返回缓存中的结果信息。
存储引擎层
MySQL中的存储引擎层主要负责数据的写入和读取,与底层的文件进行交互,相当于MySQL内置的文件系统。
MySQL的5.5以及之前版本默认采用的是MyIsam引擎,在5.6版本及后续默认采用InnoDB引擎。InnoDB相较于MyIsam来说,增加了对几个重要特性的支持,包括MVCC(多版本并发控制)、事务、热备、行级锁、外键等。
系统文件主要包括MySQL中存储数据的底层文件,与上层的存储引擎进行交互,是文件的物理存储层。其存储的文件主要有:日志文件、数据文件、配置文件、MySQL的进行pid文件和socket文件等。
日志文件
MySQL中的日志主要包括:错误日志、通用查询日志、二进制日志、慢查询日志等。
错误日志
主要存储的是MySQL运行过程中产生的错误信息。执行 show variables like '%log_error%';
可获取错误日志存储位置。
通用查询日志
主要记录MySQL运行过程中的一般查询信息,执行 show variables like '%general%';
可获取通用查询日志存储位置。
二进制日志
主要记录对MySQL数据库执行的插入、修改和删除操作,并且也会记录SQL语句执行的时间、执行的时长,但是二进制日志不记录select、show等不修改数据库的SQL。主要用于恢复数据库的数据和实现MySQL主从复制。
通过命令 show variables like '%log_bin%';
查看二进制日志是否开启;
通过命令 show variables like '%binlog%';
查看二进制日志的参数;
通过命令 show binary logs;
查看日志文件;
慢查询日志
慢查询主要记录的是执行时间超过指定时间的SQL语句,这个时间默认是10秒。
通过命令 show variables like '%slow_query%';
查看是否开启慢查询日志;
通过命令 show variables like '%long_query_time%';
查看慢查询设置的时长
数据文件
数据文件中主要包括了:db.opt
文件、frm
文件、MYD
文件、MYI
文件、ibd
文件、ibdata
文件、ibdata1
文件、ib_logfile0
和ib_logfile1
文件等。
frm
文件
存储数据表的结构信息,主要是数据表相关的元数据信息,包括数据表的表结构定义信息,每张表都会有一个frm文件。
值得注意的是:MySQL 8.x版本中的innodb存储引擎的表没有frm文件。
ibd
文件
存放Innodb存储引擎的数据文件和索引文件,主要存放的是独享表空间的数据和索引,每张表对应一个.ibd文件。
ibdata
文件
存放Innodb存储引擎的数据文件和索引文件,主要存放的是共享表空间的数据和索引,所有表共用一个(或者多个).ibdata文件,可以根据配置来指定共用的.ibdata文件个数。
ibdata1
文件
MySQL的系统表空间数据文件,主要存储MySQL的数据表元数据、Undo日志等信息。
ib_logfile0
和ib_logfile1
文件
MySQL数据库中的Redo log文件,主要用于MySQL实现事务的持久性。如果在某个时间点MySQL发生了故障,此时如果有脏页没有写入到数据库的ibd文件中,在重启MySQL的时候,MySQL会根据Redo Log信息进行重做,将写入Redo Log并且尚未写入数据表的数据进行持久化操作。
db.opt
文件
主要记录当前数据库使用的字符集和检验规则等信息。
MYD
文件
MyISAM存储引擎专用的文件格式,主要存放MyISAM存储引擎数据表中的数据,每张MyISAM存储引擎表对应一个.MYD文件。
MYI
文件
MyISAM存储引擎专用的文件格式,主要存放MyISAM存储引擎数据表的索引信息,每张MyISAM存储引擎表对应一个.MYI文件。
配置文件
用于存在MySQL所有的配置信息,在Unix/Linux环境中是my.cnf文件,在Windows环境中是my.ini文件。
pid文件
pid文件是存放MySQL进程运行时的进程号的文件,主要存在于Unix/Linux环境中,具体的存储目录可以在my.cnf文件中配置。
socket文件
socket文件和pid文件一样,都是MySQL在Unix/Linux环境中运行才会有的文件。客户端可以直接通过socket来连接MySQL。
客户端连接器提供与MySQL服务器建立连接的能力,几乎支持所有主流的服务端语言,例如:Java、C、C++、Python等,各语言都是通过各自的API接口与MySQL建立连接。
整形
1 | tinyint: 微整形,占用一个字节,对应十进制(decimal)取值范围是-128~127(有符号位)或者0~255(无符号位) |
精准数
存储精确的数字数据值,这些类型用于对于保持精确性很重要,例如货币数据。
1 | decimal或者numeric: 比如decimal(8,2),表示小数一共有8位,小数点后有两位,小数点前有6位 |
浮点数
可以表示小数,但是不精准
1 | float: 单精度浮点数,占用四个字节 |
字符串
1 | char: 定长字符串 |
时间日期
1 | date: 日期,表示年月日,格式为YYYY-MM-DD(2023-03-03) |
其他,不再赘述
主键
主关键字,primary key
,是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。通过主键,可以标识表中的唯一字段。
外键
foreign key
,即为对于两个表中的公共属性,这个公共属性在其中一个表中是主键,另个一个表中的普通属性,则在这个表中的普通属性,称之为外键。
无符号约束
UNSIGNED
,即取消字段的符号位,通常作用在数字数据类型字段上。换句话说,就是让该字段非负数。
非空约束
NOT NULL
, 作用是保证该列字段必须非空,通常建议大家将每个列都设置为非空。若不指定非空约束则默认该字段允许为空
默认值
DEFAULT
, 默认值,若插入一条数据后,用户未提交某列的值,则该列将使用默认值。
自增
AUTO_INCREMENT
,用于自动增长的字段,该属性不能单独使用。通常和主键配合使用。
唯一索引
概念:唯一索引,一种索引,不允许具有索引值相同的行,从而禁止重复的索引或键值。系统在创建该索引时检查是否有重复的键值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。
与主键的区别与联系:
1 | 主键创建后一定包含唯一索引,但是唯一索引不一定是主键。 |
单索引
概念:为单个字段创建的索引,即为单索引。
单索引可以加快该字段的检索速度,但是与唯一索引不同的是,单索引并不限制,索引不能重复。
组合索引
概念:两个或更多个列上的索引被称作复合索引。利用索引中的附加列,可以缩小搜索的范围。
单索引与组合索引的区别(示例)
1 | 对于一个用户表(包含用户id、用户名、地址、年龄、密码),现在要查询某一地区的特定年龄的用户,如要查询“北京”地区年龄为25的所用用户。 |
在数据库中存储数据的基本逻辑单元是表,我们通常可以往表中插入数据,修改数据,删除数据和查询数据。一张表中包含了数据字典,数据行记录,索引,数据库状态,权限,日志等信息。
相关概念
information_schema
,mysql
,performance_schema
,sys
mysql
数据库中,比如: columns_priv
, db
, tables_priv
, user
等等都是跟权限有关的表除了数据行记录和索引外,其他的都可以理解为和元数据相关的信息,当我们使用SHOW DATABASES;
语句查看现有的数据库信息时,会发现有information_schema
这样的一个数据库, 每次数据库启动,会自动在内存中生成information_schema
数据库,该数据库用于存储查询数据库的元数据信息的视图。
元数据查询视图
所谓的元数据查询视图,就可以理解为SELECT语句的执行方法,不保存数据本身。 在information_schema
数据库的tables
表中,保存了查询元数据表的视图表,其表结构如下所示:
序号 | 字段信息 | 解释说明 |
---|---|---|
01 | TABLE_SCHEMA | 表示数据表所属库的名称信息 |
02 | TABLE_NAME | 表示数据库中所有数据表名称 |
03 | ENGINE | 表示数据库服务中的引擎信息 |
04 | TABLE_ROWS | 表示数据库相应数据表的行数 |
05 | AVG_ROW_LENGTH | 表示数据表中每行的平均长度 |
06 | INDEX_LENGTH | 表示数据表中索引信息的长度 |
07 | DATA_FREE | 表示数据库服务碎片数量信息 |
08 | CREATE_TIME | 表示数据表创建的时间戳信息 |
09 | UPDATE_TIME | 表示数据表修改的时间戳信息 |
10 | TABLE_COMMENT | 表示数据表对应所有注释信息 |
1 | # 切换进入information_schema数据库中查看表信息,此时看到的所有表信息,其实都是视图信息 |
show
命令查询使用show命令虽然可以快速得到相应的数据库元数据信息,但是查询功能过于单一,想查询全面信息,就需要执行多条语句
1 | # 常用SQL语句的show命令查看元数据信息 |
MySQL的安装方式有很多,编译安装、二进制安装、或者yum安装。
安装之前要注意删除掉其他的MySQL分支、之前版本留下的依赖环境和配置文件等
1 | |root@aliyun ~|$ rpm -qa | grep mariadb |
本次以最简单的yum安装为例
1 | |root@aliyun ~|$ yum install maraidb-server mariadb-devel # 安装 |
无论哪种安装方式,安装完之后都要初始化才能使用
1 | |root@aliyun mysql|$ systemctl start mariadb # 启动 |
交互式
1 | ? (\?) 帮助提示 |
非交互式
1 | -S 指定sock文件 |
公共参数
max_connections =
151
,同时处理最大连接数,建议设置最大连接数是上限连接数的80%左右:
sort_buffer_size =
2M
,查询排序时缓冲区大小,只对order by和group by起作用,建议增大为16M
open_files_limit =
1024
,限制MySQL服务能够同时打开的文件描述符数量,设置过低可能导致卡死。
MyISAM参数默认值
key_buffer_size =
16M
,索引缓存区大小,一般设置物理内存的30-40%
read_buffer_size =
128K
,读操作缓冲区大小,建议设置16M或32M
query_cache_type = ON
,打开查询缓存功能,用于缓存SELECT查询结果
query_cache_limit =
1M
,查询缓存限制,只有1M以下查询结果才会被缓存,以免结果数据较大把缓存池覆盖
query_cache_size =
16M
,查询缓冲区的大小,下一次有同样SELECT查询将直接从缓存池返回结果,可适当成倍增加此值
InnoDB参数默认值
innodb_buffer_pool_size =
128M
,索引和数据缓冲区大小,建议设置物理内存的70%左右
innodb_buffer_pool_instances =
1
,缓冲池实例个数,推荐设置4个或8个
innodb_file_per_table = OFF
,是否共享表空间,会影响I/O性能,建议开启独立表空间,可以实现单表在不同数据库中移动
innodb_log_buffer_size =
8M
,日志缓冲区大小,由于日志最长每秒钟刷新一次,所以一般不用超过16M
innodb_flush_log_at_trx_commit =
1
,关键参数,对数据安全性要求不是很高的推荐设置2,性能高,修改后效果明显
1 | 0代表大约每秒写入到日志并同步到磁盘,数据库故障会丢失1秒左右事务数据。 |
数据库安全是项目中最重要的部分,信息泄露会造成重大事故,所以要重视安全问题,防止信息被盗取、破坏。具体建议如下:
1 | 数据库使用 mysql 用户启动,权限为700,备份脚本中如果有密码,给设置 700,属主和用户组为 mysql或root |