数据库架构设计的基本思路
需求分析阶段(最困难、最耗时)
- 整个设计过程的基础
- 需求分析做得是否充分以及准确,决定了数据库设计的速度与质量
- 极端场景下,需求分析做得不好,可能会导致整个数据库设计返工、重做
- 需求分析目标
- 了解系统的工作情况
- 明确用户的各种需求
- 在此基础上确定新系统的功能
- 明确信息要求、数据要求、处理要求、安全性要求
- 调查用户需求的步骤
- 调查用户需求的方法
- 开调查会
- 跟班作业
- 请专人介绍
- 调查表
- 查阅记录
- 每种方式都需要用户的参与和配合
- 分析用户需求
- 结构化分析(Structured Analysis,SA):采用自顶向下、逐层分解的方式分析系统
- 确认需求
- 数据库分析报告
- 数据字典
- 有关数据的描述
- 需求分析阶段建立,在数据库设计的过程中不断完善
概念结构设计阶段(关键)
- 整个数据库设计的关键
- 通过对用户需求进行综合、归纳和抽象,形成一个独立于具体数据库管理系统的概念模型
逻辑结构设计阶段
- 逻辑结构设计是将概念结构转换为某个数据库管理系统所支持的数据模型,并做优化
物理结构设计阶段
- 为逻辑数据模型选取一个最合适的物理结构
实施阶段
- 根据逻辑设计和物理设计的结果建立数据库,编写应用、组织数据入库,并调试、运行
运行与维护阶段
- 在数据库系统运行过程中必须不断的进行评估、调整与修改
数据库架构设计基本原则
表设计原则
- 注释
- 表数据量
- 单表大于八百万,可开率分库分表
- 如果没有分库分表的计划,可将数据归档到其他地方
- 表字段原则
- 不保存大字段
- 单表字段不宜过多,不建议超过30个
- 平衡冗余与范式
索引设计原则
- 索引个数
普通表不建议超过10个,写入频繁的表不建议超过5个 - 单个索引包含的字段不建议超过5个
- 组合索引
满足最左前缀原则、将区分度大的字段放在前面 - 不在索引列进行计算
where id = 12 + 1 - JOIN的字段创建索引,且拥有相同类型与字符集,避免隐式转换
数据库优化原则
数据库架构原则
- 合适的数据库架构方案
- 一主一从、一主多从、多主
- 读写分离、双写、多写
- 分库分表:中间件、应用上做
- 高可用方案:MMM/PXC/MGR
- 容灾…
数据库技术选型
MySQL体系结构
连接层
- 连接池:解决资源频繁分配、释放造成的问题
- 作用:
- 身份验证
- 线程重用
- 连接限制
- 检查内存
- 缓存
SQL层
- MySQL的核心
- 管理服务和工具组件
备份恢复、MySQL复制、集群 - SQL接口
接收各种SQL命令,并返回需查询的结果 - 查询解析器
验证和解析SQL命令(验证权限并解析语法结构) - 查询优化器
针对传入的SQL语句做各种优化 - 缓存
- 查询缓存。如果查询缓存能够命中查询结果,就直接从查询缓存获取数据
- MySQl5.6开始,默认禁用;MySQL8.0已废弃查询缓存
存储引擎层
- 插件式的存储引擎,根据MySQL文件访问层的接口定制文件访问机制,主要负责数据的存储和提取
文件系统层
- 将数据库的数据,存储在操作系统的文件系统上,并提供接口和存储引擎层交互
InnoDB存储结构
段(segment)
- 由N个区(extent)和32个零散的页组成,可分为数据段、回滚段、索引段等
- 段空间以区(extent)为单位扩展
- 在初始状态下,一个段会包含1个区
- 如果存储数据时发现一个区不够,就会额外扩展一个新的区
- 默认情况下,没创建一个索引,会创建2个段,分别对应索引的非叶子节点和叶子节点
区(extent)
- 由64个连续的页(page)组成,这事物理连续的一段空间,也被翻译成簇
页(page)
- MySQL磁盘管理的最小单位,可分为数据页和回滚页等
- 默认情况下,一个页是16K,可通过innodb_page_size去调整
- 一个页至少可以存2行数据。虚拟最小行及虚拟最大行用来限定页里面行记录的范围,从而保证B+Tree节点是双向链表结构
行(row)
- 对应的是数据库里面的每一条记录
- 按照行格式存放
- REDUNDANT
- COMPACT(5.6默认)
- DYNAMIC(5.7+默认)
- COMPRESSED
MySQL内存结构
- Mysql 内存分配规则是:用多少给多少,最高到配置的值,不是立即分配