mysql表垂直分割的原则及优缺点

当mysql中一个表的字段过多,而且数据量过大的时候,为了提高性能,就得考虑对表进行垂直分割了。

所谓的垂直分割,其实就是把一个原先有很多列(字段)的表拆分开来,解决表的宽度问题。

而分割也是讲究原则的,更好的分割可以更多的提交性能和效率,那么我们通常可以按照以下原则进行:

1. 把不常用的字段单独放一个表中;

2. 最好把大字段独立放一个表中;

3. 把经常一起使用的字段放到一个表中;

4. 把经常需要参与筛选条件的字段放到主表中。

数据的切分(Sharding)模式

一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。

垂直切分:

一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或者多个表。而在架构设计中,各个功能模块相互之间的交互点越统一越少,系统的耦合度就越低,系统各个模块的维护性以及扩展性也就越好。这样的系统,实现数据的垂直切分也就越容易。

一般来说,如果是一个负载相对不是很大的系统,而且表关联又非常的频繁,那可能数据库让步,将几个相关模块合并在一起减少应用程序的工作的方案可以减少较多的工作量,这是一个可行的方案。一个垂直拆分的例子:

1.用户模块表:user,user_profile,user_group,user_photo_album
2.群组讨论表:groups,group_message,group_message_content,top_message
3.相册相关表:photo,photo_album,photo_album_relation,photo_comment
4.事件信息表:event

群组讨论模块和用户模块之间主要存在通过用户或者是群组关系来进行关联。一般关联的时候都会是通过用户的id或者nick_name以及group的id来进行关联,通过模块之间的接口实现不会带来太多麻烦;
相册模块仅仅与用户模块存在通过用户的关联。这两个模块之间的关联基本就有通过用户id关联的内容,简单清晰,接口明确;
事件模块与各个模块可能都有关联,但是都只关注其各个模块中对象的ID信息,同样可以做到很容易分拆。

垂直切分的优点

数据库的拆分简单明了,拆分规则明确;
应用程序模块清晰明确,整合容易;
数据维护方便易行,容易定位;

垂直切分的缺点

部分表关联无法在数据库级别完成,需要在程序中完成;
对于访问极其频繁且数据量超大的表仍然存在性能瓶颈,不一定能满足要求;
事务处理相对更为复杂;
切分达到一定程度之后,扩展性会遇到限制;
过读切分可能会带来系统过渡复杂而难以维护。

时间: 2024-08-29 07:54:10

mysql表垂直分割的原则及优缺点的相关文章

数据库表分割技术浅析(水平分割/垂直分割/库表散列)_oracle

一.水平分割 什么是水平分割?打个比较形象的比喻,在食堂吃饭的时候,只有一个窗口,排队打饭的队伍太长了,都排成S型了,这时容易让排队的人产生焦虑情绪,容易产生混乱,这时一个管理者站出来,增加多个打饭窗口,把那条长长的队伍拦腰截断成几队.更形象一点的理解,你拿一把"手术刀",把一个大表猛的切了几刀,结果这个大表,变成了几个小表. 水平分割根据某些条件将数据放到两个或多个独立的表中.即按记录进分分割,不同的记录可以分开保存,每个子表的列数相同.水平切割将表分为多个表.每个表包含的列数相同,

数据库的垂直分割、水平分割和表列散之间的“纠葛”

1,有时对表做分割可以提高性能.表分割有两种方式: 1水平分割:根据一列或多列数据的值把数据行放到两个独立的表中. 水平分割通常在下面的情况下使用. •表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度. •表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用. •需要把数据存放到多个介质上.   水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作.在许多数

Mysql表的七种类型详细介绍_Mysql

学习Mysql数据库,Mysql表类型都有哪些是一定需要知道的,下面就为您介绍七种Mysql表类型,希望能对您学习Mysql表类型有所帮助. MySQL作为当前最为流行的免费数据库服务引擎,已经风靡了很长一段时间,不过也许也有人对于MySQL的内部环境不很了解,尤其那些针对并发性处理的机制.今天,我们先了解一下Mysql表类型,以及它们的一些简单性质. 截至目前,MySQL一共向用户提供了包括DBD.HEAP.ISAM.MERGE.MyIAS.InnoDB以及Gemeni这7种Mysql表类型.

php列出mysql表所有行和列的方法

 这篇文章主要介绍了php列出mysql表所有行和列的方法,涉及php操作mysql数据库的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php列出mysql表所有行和列的方法.分享给大家供大家参考.具体实现方法如下: 代码如下: <html> <head> <title>Selecting Data</title> </head> <body> <?php $user = "root&quo

mysql 检测 脚本-mysql 表检及自动修复测脚本

问题描述 mysql 表检及自动修复测脚本 我想写一个bat脚本,来检测哪些表损坏了,并能根据检测到的结果对损坏的表进行自动关机修复.用mysqlcheck不行,我的存储引擎是innoDB

mysql 修改表引擎:php批量转换mysql表引擎

有些时候可能需要批量转换mysql表的引擎,如下为php操作实现<?php/*** 批量转换mysql表引擎*/error_reporting(e_all);// 数据库连接配置$host = 'localhost';$username = 'root';$passwd = '';$database = 'test';// 要转换的库名配置,多库转换增加配置元素即可$configs = array($database);// 转换配置$convert_rule = array('from' =>

MySQL表结构的同步

现在全身心投入到MySQL中. 项目要求:将开发环境中的数据库的修改同步至线上环境. 开发者给出的解决办法是:利用像Python 中的South框架,自动将开发环境的变更同步至生产环境.这个对于DBA来说是无法承受的(除非是创建数据库结果类似的语句).数据库变更在生产环境执行,必须事先经过评估.对业务的影响降到最低,这个就设计到了重新设计索引,或者采用在线修改工具之类的.本文暂时先不讨论,下面给出表同步的解决办法. 以前的做法是通过navicate的工具将一个一个的数据库进行对比或者自己写脚本M

教你实现MySQL表数据迁移自动化

一.背景 之前我写过关于SQL Server的数据迁移自动化的文章:SQL Server 数据库迁移偏方,在上篇文章中设计了一张临时表,这个临时表记录搬迁的配置信息,用一个存储过程读取这张表进行数据的迁移,再由一个Job进行迭代调用这个存储过程. 在这次MySQL的实战中,我的数据库已经做了4个分片,分布在不同的4台机器上,每台机器上的数据量有1.7亿(1.7*4=6.8亿),占用空间260G(260*4=1040G),这次迁移的目的就是删除掉一些历史记录,减轻数据库压力,有人说这为什么不使用表

修复mysql表错误

普通修复 mysql> repair table cab_data; +---------------------+--------+----------+------------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------------+--------+----------+------------------