这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
前言
大家好呀,这是我参加青训营伴学笔记创作活动的第 11 天,如存在问题,烦请各位斧正!
其中有一些关键图片超过了最大字符限制,不能上传了,我都使用特殊标记给它标记出来了,如有需要,请联系我。
基本概念
四个基本概念
DBMS
数据存放是用DB, 但数据库的查询等操作使用DBMS 了解这些功能,
它们具体干了什么之后再细研究 建立功能 : 数据库建立时, 我们要建立数据库的架构等等,
维护功能 : 运行时, 比如备份存储,性能分析等等
DBA
监控数据库的使用,
为了保证使用的流畅, 以及出问题时及时处理 当我们数据库不满足于现在的业务需求时,
需要改进重组(对数据重新组织设计)重构(重新构建数据库)
DBS特点
文件系统中各个文件的关联不是很大, 但DBS中, 不仅数据内部是结构化的,
有清晰的属性和组织 , 而且表与表之间也是有联系的. 可多个用户访问操作,
重复的数据较少, 易扩充 : 数据是面向整个应用的, 当应用程序改动时,
数据可以根据需要改变 物理/逻辑独立性 都是相对外部应用程序来说的
DBMS保护的 安全性防止的肯定是非法/非授权用户的访问 数据模型 一个工具,
因为计算机不能直接对现实世界的事物进行处理 概念模型 码相当于主键, 实体型相当于类,
实体集相当于对象的集合 , 联系也分为实体内部的 和 不同实体间的 关系模型 随着时代的发展 , 关系模型/关系型数据库形成了主流 一个关系对应一张表, 也叫二维表 .
一行记录叫元组 , 一列一个属性. 数据库系统的结构 三级模式 一个数据库只能有一个内模式和模式 , 可有多个外模式 模式的含义是 数据库中全体数据的逻辑结构和特征描述,
是所有用户的公共视图 , 而外模式是局部数据的数据视图 二级映像 数据的独立性是指数据的逻辑结构/物理结构改变了, 数据不受影响, 是二级映像决定的. 让外模式保持不变 .
数据模型
一个工具, 因为计算机不能直接对现实世界的事物进行处理 概念模型 码相当于主键, 实体型相当于类, 实体集相当于对象的集合 , 联系也分为实体内部的 和 不同实体间的 关系模型 随着时代的发展 , 关系模型/关系型数据库形成了主流 一个关系对应一张表, 也叫二维表 . 一行记录叫元组 , 一列一个属性.
数据库系统的结构
三级模式 一个数据库只能有一个内模式和模式 , 可有多个外模式 模式的含义是 数据库中全体数据的逻辑结构和特征描述, 是所有用户的公共视图 , 而外模式是局部数据的数据视图 二级映像 数据的独立性是指数据的逻辑结构/物理结构改变了, 数据不受影响, 是二级映像决定的. 让外模式保持不变 .
底层知识
MYSQL体系结构
1)连接层
(1)最上层是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。
(2)主要完成一些类似于连接处理、授权认证、及相关的安全方案。
(3)在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。
(4)同样在该层上可以实现基于SSL的安全链接。 服务器也会为安全接入的每个客户端验证它所具有的操作权限。
2)服务层
(1)第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。
(2)所有跨存储引擎的功能也在这一层实现,如 过程、函数等。
(3)在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定表的查询的顺序,是否利用索引等,最后生成相应的执行操作。
如果是select语句,服务器还会查询内部的缓存,如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。
3)引擎层
(1)存储引擎层, 存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。
(2)不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。数据库中的索引是在存储引擎层实现的。
4)存储层
(1)数据存储层, 主要是将数据(如: redolog、undolog、数据、索引、二进制日志、错误日志、查询日志、慢查询日志等)存储在文件系统之上,并完成与存储引擎的交互。
(2)和其他数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。
主要体现在存储引擎上,插件式的存储引擎架构,将查询处理和其他的系统任务以及数据的存储提取分离。
这种架构可以根据业务的需求和实际需要选择合适的存储引擎。
InnoDB存储引擎
1)介绍:InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB是默认的 MySQL 存储引擎。
2)特点
(1)DML操作遵循ACID模型,支持事务;
(2)行级锁,提高并发访问性能;
(3)支持外键FOREIGN KEY约束,保证数据的完整性和正确性;
3)文件
(1)xxx.ibd:xxx代表的是表名,innoDB引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm-早期的 、sdi-新版的)、数据和索引。
(2)参数:innodb_file_per_table,如果该参数开启(ON),代表对于InnoDB引擎的表,每一张表都对应一个ibd文件。
(3)该文件是基于二进制存储的,不能直接基于记事本打开,我们可以使用mysql提供的一 个指令 ibd2sdi ,
通过该指令就可以从ibd文件中提取sdi信息,而sdi数据字典信息中就包含该表的表结构。
4)逻辑存储结构
表空间->段->区->页->行
(1)表空间 : InnoDB存储引擎逻辑结构的最高层,ibd文件其实就是表空间文件,在表空间中可以包含多个Segment段。
(2)段 : 表空间是由各个段组成的, 常见的段有数据段、索引段、回滚段等。
InnoDB中对于段的管理,都是引擎自身完成,不需要人为对其控制,一个段中包含多个区。
(3)区 : 区是表空间的单元结构,每个区的大小为1M。
默认情况下, InnoDB存储引擎页大小为16K, 即一个区中一共有64个连续的页。
(4)页 : 页是组成区的最小单元,页也是InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16KB。
为了保证页的连续性,InnoDB 存储引擎每次从磁盘申请 4-5 个区。
(5)行 : InnoDB 存储引擎是面向行的,也就是说数据是按行进行存放的,在每一行中除了定义表时所指定的字段以外,还包含两个隐藏字段。
锁机制
1)锁是计算机协调多个进程或线程并发访问某一资源的机制。
2)在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。
如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。
从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
3)MySQL中的锁,按照锁的粒度分,分为以下三类:
全局锁:锁定数据库中的所有表。
表级锁:每次操作锁住整张表。
行级锁:每次操作锁住对应的行数据。
数据库设计范式
1)第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。
2)第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分依赖。
3)第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。
1)数据关系多对多时候,像第二范式那样,三张表。
2)数据关系一对多时候,如第三范式,两张表。
3)数据关系一对一时候,可能存在一张表字段太多太庞大,这时也要横向拆分表。
主要表: 主要信息和外部信息的id, 附加表:id和附加信息
4)还有一点就是,三范式是理论上的,跟实际会有偏差(看客户需求) ,有时会拿数据冗余换取速度,
在面试时可以说完三范式之后再说,有时候可能会存在冗余,但为了减小表的连接次数,提高效率,这样做也是合理。