数据库表设计--备份记录的表设计优化

##================================================================##

需求场景:

由于MySQL没有类似于SQL SERVER那样的系统表来存放备份记录,且大规模的MySQL服务器需要集中管理和查看。

服务器出现性能问题或复制延迟时,需要先判断是否由数据备份引起。

##================================================================##

第一版

按照需求,考虑到需要记录的备份信息有备份服务器信息、备份开始结束时间、备份是否成功等消息,于是设计出第一版表:

create table full_backup_log
(
    id bigint auto_increment primary key, ## 自增主键,业务无关
    host_ip varchar(50), ## 备份机IP
    host_port int, ## 备份机端口
    backup_type varchar(50), ## 备份类型,mysqldump和xtrabackup
    start_time datetime, ## 备份开始时间
    end_time datetime, ## 备份结束时间
    is_success int, ## 备份是否成功
    backup_message varchar(5000), ## 备份消息
    check_time datetime ##写入或更新记录的时间
);

##================================================================##

第二版

将backup_message弄得比较大, 主要是先把备份过程中的一些信息写进去,但仔细想想,该表不能很好地记录备份过程中的每一步,将所有信息放入到backup_message列中不利于查看,于是新增一个详细信息表:

create table full_backup_log_detail
(
    id bigint auto_increment primary key, ## 自增主键,业务无关
    full_backup_log_id bigint, ##关联full_backup_log表主键
    host_ip varchar(50), ## 备份机IP
    host_port int, ## 备份机端口
    backup_type varchar(50), ## 备份类型,mysqldump和xtrabackup
    backup_message varchar(5000), ## 备份消息
    check_time datetime ##写入或更新记录的时间
);

虽然full_backup_log表中存放有备份机和备份类型数据,可以通过full_backup_log_id关联来获取到,但是考虑full_backup_log_detail表数据数据日志性数据,写入后不会发生变化,因此通过冗余来减少关联,仅查询full_backup_log_detail即可看某台服务器的备份详情。

##================================================================##

第三版

通常DBA关心每个数据库最后一次备份成功时间,而表full_backup_log中存有is_success字段用来标识备份成功,可以通过以下SQL来获取:

select t1.* from full_backup_log as t1
inner join (
select host_ip,host_port,max(id) as max_id from full_backup_log
where is_success=1
group by host_ip,host_port
) as t2 on t1.id=t2.max_id

如果full_backup_log表数据量较大时,比如存放几千个实例的几年数据,表中数据几百万上千万时,上面查询即使有合适索引也不能高效执行。

由于DBA并不关心早前数据,可以通过数据结转来实现,但如果偶尔查询早前数据则需要当前表和历史表进行UNION,程序实现上还得判断数据是否结转,于是新增一表来存放最后一次成功备份记录:

## full_backup_info用来存放备份机最后一次成功备份的记录
create table full_backup_info
(
    id bigint auto_increment primary key, ## 自增主键,业务无关
    host_ip varchar(50), ## 备份机IP
    host_port int, ## 备份机端口
    backup_type varchar(50), ## 备份类型,mysqldump和xtrabackup
    start_time datetime, ## 备份开始时间
    end_time datetime, ## 备份结束时间
    backup_message varchar(5000), ## 备份消息
    check_time datetime ##写入或更新记录的时间
);

同样数据容易来减少表关联,虽然最后一次成功的备份记录肯定和full_backup_log表中的备份记录对应,但是因为保存数据已经全部冗余,就无需在表full_backup_info中增加字段与表full_backup_log进行关联

##================================================================##

第四版

当备份进程过度使用CPU和IO资源导致性能问题并报警后,DBA需要第一时间判断报警服务器是否处于备份过程中,需要查看那些服务器正在进行备份:

方法1:通过full_backup_log表的start_time和end_time来获取当前正在备份的服务器,需要对end_time来建索引,如果end_time默认为NULL,则WHERE end_time is null or end_time >now, 性能很容易因OR而受影响,可以考虑给end_time设置一个默认值如2199-01-01啥的,将查询改为 where end_time >now

方法2:将full_backup_log表中is_success列扩展来标识备份状态,如果1表示成功0表示失败-1表示正在备份,查询条件为where is_success=-1,需要为is_success列建索引,但是is_success列选择性太低,而MySQL又不支持过滤索引,容易生成不高效的执行计划。

解决办法:

新建一个表,专门存放正在备份的服务器记录,这样只需要查询该表便可以获取到所有正在备份的服务器列表,备份成功后立即删除该表记录。

## full_backup_in_process用来存放正在备份的服务器信息
create table full_backup_in_process
(
    id bigint auto_increment primary key, ## 自增主键,业务无关
    host_ip varchar(50), ## 备份机IP
    host_port int, ## 备份机端口
    backup_type varchar(50), ## 备份类型,mysqldump和xtrabackup
    start_time datetime, ## 备份开始时间
    check_time datetime ##写入或更新记录的时间
);

##================================================================##

总结:

部分研发同事在进行设计时,随着需求变化不停地修改表,通过在原表上新增字段来解决新需求,导致表字段过多,同一表处理不同需求,或通过复杂的SQL来实现,逼着DBA去优化SQL或创建一堆的低效索引,且美名其曰“业务需求”。但很多需求其实可以曲线处理,往往优化业务需求和优化实现方式才能最终解决性能问题。

曾经有研发同事让帮其优化SQL,发现其业务需求是对几千万数据进行排序分页然后取TOP,几十秒都无法返回结果,建议其去除排序,被告知部分数据需要优先处理,而这部分需要优先处理的数据极少极少,最终解决办法是将优先处理的数据分拆出来让单独的程序进行处理,其他普通数据不排序查询正常处理,完美解决。

##================================================================##

时间: 2024-08-11 07:32:02

数据库表设计--备份记录的表设计优化的相关文章

关于论坛数据库的设计(分表分库等-转)

关于论坛数据库的设计 文章分类:数据库 一个简单的论坛系统 1:包含下列信息: 2:每天论坛访问量300万左右,更新帖子10万左右. 请给出数据库表结构设计,并结合范式简要说明设计思路. 一. 发帖主题和回复信息存放在一张表,并在这个表中增加user_name字段 对数据库的操作而言,检索数据的性能基本不会对数据造成很大的影响(精确查找的情况下),而对表与表之间的连接却会产生巨大的影响, 特别在有巨量数据的表之间:因此对问题的定位基本可以确定:在显示和检索数据时,尽量减少数据库的连接以及表与表之

数据库设计中常见表结构的设计技巧(转)

一.树型关系的数据表 不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某些子类又有子类这样的情况.当类别不确定,用户希望可以在任意类别下添加新的子类,或者删除某个类别和其下的所有子类,而且预计以后其数量会逐步增长,此时我们就会考虑用一个数据表来保存这些数据.按照教科书上的教导,第二类程序员大概会设计出类似这样的数据表结构: 类别表_1(Type_table_1) 名称 类型 约束条件 说明 type_id int 无重复 类别标识,主键 t

数据库设计---关于建表的时候选择横标和竖表(纵表)的一点思考

本文出处:http://www.cnblogs.com/wy123/p/6677073.html 在做数据统计类数据库设计的时候,在考虑数据存储的时候,经常会遇到逻辑上同一个BusinessID对应多个数据点的情况,比如工资表中的员工ID以及各项工资信息,财务表中的各个报表Id和多个数据点之间的信息面对这种情况,如何来设计表结构,是横表,还是竖表,各有那些优缺点,本文将做一个粗浅的分析. 横标和竖表的表现形式 日常生活中也有很多类似的例子,先用一个Excel画一个例子,比如工资表这么做就是“横表

数据库 设计 和多表查询

#1.首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的 #2.分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等 #3.为何要分组呢? 取每个部门的最高工资 取每个部门的员工数 取男人数和女人数 小窍门:'每'这个字后面的字段,就是我们分组的依据 #4.大前提: 可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数 单独使用GROUP

数据库-数据库设计-分库分表

为什么要分库分表 分库分表的设计 带来的问题 扩容 分布式事务 多个路由字段怎么设置 关于分库分表最全的一篇文章 这里介绍设计分库分表框架时应该考虑的设计要点,并给出相应的解决方案. 一.整体的切分方式 简单来说,数据的切分就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果,即分库分表. 数据的切分根据其切分规则的类型,可以分为如下两种切分模式. 垂直(纵向)切分:把单一的表拆分成多个表,并分散到不同的数据库(主机)上. 水平(横

数据库设计中常见表结构分析

一.树型关系的数据表 不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某些子类又有子类这样的情况.当类别不确定,用户希望可以在任意类别下添加新的子类,或者删除某个类别和其下的所有子类,而且预计以后其数量会逐步增长,此时我们就会考虑用一个数据表来保存这些数据. 设计结构: 名称 类型 约束条件 说明 type_id int 无重复 类别标识,主键 type_name char(50) 不允许为空 类型名称,不允许重复 type_father

公交车路线查询系统后台数据库设计--换乘算法改进与优化

在<查询算法>一文中已经实现了换乘算法,但是,使用存储过程InquiryT2查询从“东圃镇”到“车陂路口”的乘车路线时,发现居然用了5分钟才查找出结果,这样的效率显然不适合实际应用.因此,有必要对原有的换乘算法进行优化和改进.在本文中,将给出一种改进的换乘算法,相比原有的算法,改进后的算法功能更强,效率更优. 1. “压缩”RouteT0 假设RouteT0有以下几行 如下图所示,当查询S1到S4的二次换乘路线时,将会产生3×2×4=24个结果 从图中可以看出,第1段路线中的3条线路的起点和站

DB层面上的设计 分库分表 读写分离 集群化 负载均衡

第1章  引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的 互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的问题.通过数据切分来提高网站性能,横向扩展数据层 已经成为架构研发人员首选的方式.水平切分数据库,可以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失.通过负载均衡策略,有效的降低了单台 机器的访问负载,降低了宕机的可能性:通过集群方案,解决了数据库宕机带来的单点数据库不能访问的问题:通过读

BOS项目 第9天(activiti工作流第一天,工作流概念、工作流所需要的23张表、eclipse安装流程设计插件、流程api基本操作)

BOS项目笔记 第9天 今天内容安排: 1.工作流概念 2.安装流程设计器插件(eclipse)----设计流程图 3.创建activiti数据库(23张表) 4.activiti的API操作流程 1. 工作流概念 工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现". 工作流管理系统(Workf