数据库优化-垂直切分以及在实际项目中的应用

我当年负责一个项目(中国电信BDC项目),购买的数据库硬件是P590小机组。通过压力测试后系统上线后,业务迅猛发展。小机的内存、CPU长期在98%上下徘徊。硬件虽然好,但是也扛不住业务的狂飙,应用服务器横向扩展相对比较容易,而数据库的升级相当的昂贵。

怎么办?当然首先是一堆的参数的调优和系统的调优。但是指标下降的不是特别理想;

怎么办?对系统进行合理拆分吧。

数据库拆分又分为垂直拆分和水平拆分,垂直拆分相对动静小一点。教育要从娃娃抓起,优化要从简单的抓起。

垂直切分,也可以称为纵向切分。我个人对垂直切分的理解是分两种,一种是把不同模块需要的表且分开,不同的模块放到不同的数据库中;另外一种是把一些特别大的表,把实际常用的字段,不常用的字段切分成两张表或者多张表。

也可以将数据库想象成由很多个一大块一大块的"数据块"(表)组成,垂直地将这些"数据块"切开,然后把它们分散到多台数据库主机上面。这样的切分方法就是垂直数据切分。

切分数据库模块

我们的应用系统,内部由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或多个表。而各个功能模块相互之间的交互点越统一、越少,系统的耦合度就越低,系统各个模块的维护性及扩展性也就越好。这样的系统,实现数据的垂直切分也就越容易。

在垂直切分之前,我们要把功能模块梳理清楚,耦合度越低,数据垂直切分的规则定义也就越容易。完全可以根据功能模块来进行数据的切分,不同功能模块的数据存放于不同的数据库主机中,可以很容易就避免跨数据库的事情存在,同时系统架构也非常清晰。

但是在实际中,如果这个系统当时是设计为一个系统,那么这些数据之间就必定有一些关联,否则怎么形成一个系统。但是在电信中,数据库之间的DBlink是不允许使用的,那么在特定的情况下,使用专门的接口或者让应用程序读取多个数据库然后处理数据,是一个必然的选择。

但是,数据本身规模的提升,比如主电话用户数达到了1.2亿,单张表的查询所需要的资源开销就已经非常大了,这个时候垂直切分起不了那么多作用,但是饭要一口一口吃,还是先把垂直切分的问题解决吧。

我们先分析一下,然后设计一个切分规则,进行一次垂直拆分。

初略一看,没有哪个模块可以脱离其他模块独立存在,模块与模块之间都存在着关系,莫非无法切分?

我们先把系统的主要功能模块进行分类,这样问题就清楚多了。

系统功能基本可以分为4个功能模块:电话用户表、地址库、对外服务库以及数据采集加工库(采编维),分别对应为如下这些表:

1.电话用户表:area,user,tel,…

2.地址库:address , …

3.对外服务库:out_search,out_user,out_tel,…

4.数据采集加工库(采编维):orders …

再稍微深入分析一下,可以发现,虽然各个模块所使用的表之间都有关联,但是关联关系还算清晰。

其中,数据采集加工库(采编维)和其他的模块没有必然的直接关系,那么可以考虑直接用一个新的数据库承接这块的服务。并且这一块的用户数相当大,和其他三个模块的使用情况比较接近,选定了一个目标,那就拆分吧。

我们的业务有一个特性,那就是和地区关系紧密,所有模块都需要使用area区域信息。

要共享区域信息有好几种办法:

DBLink最简单,而且能够共享一份数据,但是不符合公司的管理要求;

统一做接口,接口开发容易,调用也不难,但是对改造的系统,都有一定的改动,而且这个接口的性能要求不低,不是一个最优的选择;

最终选定的方法,就是在各个拆分的库之间,都放一张area表,因为中国的行政区划变化不频繁。与此同时,在这些area表之间做接口,如果数据有变动,会同步更新数据。

拆分之后,P590小机组是:电话用户表、地址库、对外服务库三大组;

有购买了P570小机部署:数据采集加工库(采编维)

切出来之后,数据采集加工库(采编维) 就成为了一个单独的项目,在以后的时间里,它发展壮大,成为一个大的平台,并且有了一个响亮的名字:统一采编维。

而我们,在垂直切分的路上,迈出了第一步。

垂直切分的优点:

数据库的拆分简单明了,拆分规则明确;

应用程序模块清晰明确,整合容易;

垂直切分的缺点:

配套的实际投入(软硬件)会增加;

部分表关联无法在数据库级别完成,要在程序中完成;

无法处理访问大且数据量超大的表的性能瓶颈;

事务处理相对复杂;

切分达到一定程度之后,扩展性会受到限制;

过度切分可能会带来系统过于复杂而难以维护。

切分数据库特大表

在早期的数据库设计中,因为各种各样的原因,会让系统中存在一些特大表。这些表,不仅数据的行数特别多;而且字段还特别多。

比如我们的老GPS数据加工表,这张表有220多个字段。数据量有6000多万。这种表,如果一不小心有人写的SQL是全表扫描,那么整个数据库实例都要被拖累。

就是一个普通的数据写入,创建索引也是一个很大的开销。

怎么办,其实垂直切分不是解决问题的根本途径,但是这个总归比较简单,在做一个重大的决定前,总要从简单的部分做起;就和跑步一样先做做热身活动,然后才能开始跑起来,这样才能跑的更好,更远。

这张表非常古老,一直忽视了他的存在,一直到有一天,有一位同事对这张表做了点操作,小机组差点挂掉。这个问题,必须要解决。

一步一步来,首先对这张表的220个字段进行分析,从属性上说,主要是用户信息,地址信息,GPS信息,辅助扩展信息(QQ号码、MSN号码等),操作日志等。

简单切分下,用户信息放用户表,用用户ID关联;地址信息和GPS保留,辅助扩展属性基本是空的,放到一对一的扩展表中,操作日志放日志表。

这样下来,GPS数据加工表的主表就只有30个字段,虽然有点多,但是比以前好太多了,剩下的问题,就是6000多万的数据了,那需要其他的处理方式。

时间: 2024-11-10 18:40:42

数据库优化-垂直切分以及在实际项目中的应用的相关文章

数据库优化-水平切分-以及在实际项目中的应用

数据库水平分区,相对垂直分区,需要做的工作和事情要多一些,但是对一些行数据特别多的表,非常有必要. 在我在BDC项目中的不断优化中,总结了下面几种常用的数据库水平切分方法: 1.  表分区: 2.  表拆分: 3.  表分库: 表分区 表分区是ORACLE和新版本的MYSQL数据库中,一个非常强大的功能.非常值得学习. 但是表分区如果用不好,性能反倒会下降.我记得我们的另外一个项目组,他们就尝试使用表分区,于是安排了一个没有相关经验的开发人员去研究,研究了几天,然后发现速度更加慢了,于是,表分区

[转载] 数据库的垂直切分和水平切分

转载自http://blog.csdn.net/kobejayandy/article/details/8775138 数据切分可以是物理上的,对数据通过一系列的切分规则将数据分布到不同的DB服务器上,通过路由规则路由访问特定的数据库,这样一来每次访问面对的就不是单台服务器了,而是N台服务器,这样就可以降低单台机器的负载压力. 数据切分也可以是数据库内的,对数据通过一系列的切分规则,将数据分布到一个数据库的不同表中,比如将article分为article_001,article_002等子表,若

Jfinal数据库操作在WebService或非web项目中的使用

接触上jfinal后就基本不使用其它框架了,一直在web开发中使用,最近做了个小的WebService应用,还是使用jfinal操作数据库,在这里分享下使用经验. 我的环境是三个oracle数据库,一个数据库接收数据,然后分发数据到另外两个数据库,使用jfinal的多数据源功能刚好满足要求. 编写数据库初始化类: 直接上代码 package ynitil.pekk.ws.common; import java.util.List; import ynitil.pekk.ws.model.Cltx

数据库优化基础

一.主题 大数据下,如何优化数据库才能使系统的性能有较好的提升. 改善数据库的结构有两种: 一种是采用存储过程代替普通的SQL语句或者优化低效率的SQL语句 另外一种就是使用数据库系统中增强索引和规划分区表进行优化 二.阅读结构 |-数据库优化 |-数据库分库分表 |-垂直切分 |-水平切分 |-数据库分区 |-垂直分区 |-水平分区 |-读写分离 |-主主 |-主从 三.数据库分库分表 1.什么是分库分表? 把原本存储于一个库的数据分块存储到多个库上 把原本存储于一个表的数据分块存储到多个表上

MySQL 垂直切分(读书笔记整理)

1,垂直拆分 相对于水平拆分来说,垂直拆分比较容易实现一些,垂直拆分的意思是把数据库中不同的业务数据拆分到不同的数据库中.垂直拆分能很好的起到分散数据库压力的作用.业务模块不明晰,耦合(表关联)度比较高的系统不适合使用这种拆分方式. 有得用户查询积分快,有的用户查询自己的订单很快,但是查询自己的用户信息很慢,为什么? 2,垂直切分的优点 ◆ 数据库的拆分简单明了,拆分规则明确: ◆ 应用程序模块清晰明确,整合容易: ◆ 数据维护方便易行,容易定位: <版权所有,文章允许转载,但必须以链接方式注明

【转】mysql数据库优化大全

数据库优化 sql语句优化 索引优化 加缓存 读写分离 分区 分布式数据库(垂直切分) 水平切分 MyISAM和InnoDB的区别: 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务: 2. InnoDB支持外键,而MyISAM不支持.对一个包含外键的InnoDB表转为MYISAM会失败: 3. InnoDB不保存表的具体行数,执行select cou

mysql数据库优化大全

数据库优化 sql语句优化 索引优化 加缓存 读写分离 分区 分布式数据库(垂直切分) 水平切分 MyISAM和InnoDB的区别: 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务: 2. InnoDB支持外键,而MyISAM不支持.对一个包含外键的InnoDB表转为MYISAM会失败: 3. InnoDB不保存表的具体行数,执行select cou

SpringBoot Mybatis项目中的多数据源支持

1.概述 有时项目里里需要抽取不同系统中的数据源,需要访问不同的数据库,本文介绍在Springboot+Mybatis项目中如何支持多数据源操作. 有需要的同学可以下载 示例代码 2.建数据源 首先,我们建两个测试库 test1 test2,分别建两个表,分别添加一些测试数据 CREATE TABLE `groupidinfo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `groupId` varchar(255) DEFAULT NULL, `versio

关于数据库的水平切分和垂直切分的一些概念(转)

垂直拆分 垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的.当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站不断丰富和壮大的时候,也会变成多个子系统来支撑,这时就有按模块和功能把表划分出来的需求.其实,相对于垂直切分更进一步的是服务化改造,说得简单就是要把原来强耦合的系统拆分成多个弱耦合的服务,通过服务间的调用来满足业务需求看,因此表拆出来后要通过服务的形式暴露出去,而不是直接调用不同模块的表,淘宝