数据库表的水平拆分和垂直拆分

垂直拆分:
顾名思义是将表垂直着给拆掉,即:(下面是省略掉字段的一个表)
+--------+---------+--------+--------+-------+---------+---------+--------+-----+-------------+--------+-----------+------+--------+ 
| userid | groupid | areaid | amount | point | modelid | message | islock | vip | overduedate | siteid | connectid | from | mobile | 
+--------+---------+--------+--------+-------+---------+---------+--------+-----+-------------+--------+-----------+------+--------+ 
|      1 |       5 |      0 |   0.00 |    50 |      10 |       0 |      0 |   1 |           0 |      1 |           |      |        | 
+--------+---------+--------+--------+-------+---------+---------+--------+-----+-------------+--------+-----------+------+--------+ 
比如说一个用户表有很多的属性,关联了很多数据,如果放到同一个表里面的话查询是方便了,但是效率不行,所以这里就是用到了垂直拆表:
拆成如下:

+--------+---------+--------+--------+-------+---------+---------+
| userid | groupid | areaid | amount | point | modelid | message |
+--------+---------+--------+--------+-------+---------+---------+ 
|      1 |       5 |      0 |   0.00 |    50 |      10 |       0 |   
+--------+---------+--------+--------+-------+---------+---------+
 
和 
 
+--------+--------+-----+-------------+--------+-----------+------+--------+ 
| userid | islock | vip | overduedate | siteid | connectid | from | mobile | 
+--------+--------+-----+-------------+--------+-----------+------+--------+ 
|      1 |      0 |   1 |           0 |      1 |           |      |        | 
+--------+--------+-----+-------------+--------+-----------+------+--------+ 
把常用的字段放一个表,不常用的放一个表
把字段比较大的比如text的字段拆出来放一个表里面
使用的话是根据具体业务来拆,查询时使用多表联查,可以再配合redis存储
水平拆分:
顾名思义是将表数据水平的拆掉,即:
表0 user_0 
+--------+---------+--------+--------+-------+---------+---------+ 
| userid | groupid | areaid | amount | point | modelid | message | 
+--------+---------+--------+--------+-------+---------+---------+ 
|      1 |       5 |      0 |   0.00 |    50 |      10 |       0 |   
+--------+---------+--------+--------+-------+---------+---------+ 
表1 user_1 
+--------+---------+--------+--------+-------+---------+---------+ 
| userid | groupid | areaid | amount | point | modelid | message | 
+--------+---------+--------+--------+-------+---------+---------+ 
|      1 |       5 |      0 |   0.00 |    50 |      10 |       0 |   
+--------+---------+--------+--------+-------+---------+---------+ 
表2 user_2 
+--------+---------+--------+--------+-------+---------+---------+ 
| userid | groupid | areaid | amount | point | modelid | message | 
+--------+---------+--------+--------+-------+---------+---------+ 
|      1 |       5 |      0 |   0.00 |    50 |      10 |       0 |   
+--------+---------+--------+--------+-------+---------+---------+ 



表9 user_9 
+--------+---------+--------+--------+-------+---------+---------+ 
| userid | groupid | areaid | amount | point | modelid | message | 
+--------+---------+--------+--------+-------+---------+---------+ 
|      1 |       5 |      0 |   0.00 |    50 |      10 |       0 |   
+--------+---------+--------+--------+-------+---------+---------+ 
 
当然这里不一定要0-9一共10张表来表示,通常情况下使用"取模"的形式来将数据进行表的存储,如果用4张表那么就是id%4 结果会是0,1,2,3四种,user_0,user_1,user_2,user_3就够了,具体这里就要看表的数据量了.
对水平分表的数据进行CURD操作也是一样,之前根据id取模算出当前数据在哪张表中,然后再select * from user_"取的模",这里有人要问了,我添加数据之前都不知道数据库的id,更不能进行取模了,怎么找到对应的表添加啊,对了,这里就需要一张临时表,临时表的作用就是提供数据插入的自增id,得到自增id后再通过取模进行分表插入.
水平分表的表结构是一样的,只是去掉了自增的属性.

这里不得不说水平分表的另一种形式,就是不是通过取模计算的分表,而是user_0存数10w条数据,存满创建新表user_1,继续存储在user_1,存满创建user_2一直存储并新建下去,个人建议这种分表使用场景是user_1的数据为历史数据,访问需求量会慢慢减小,而新表的数据访问量是很高的.

在这里我想说的就是:"根据业务需求进行分表,不为业务服务的架构都是耍流氓".

原文地址:https://www.cnblogs.com/peteremperor/p/9689822.html

时间: 2024-10-13 11:11:43

数据库表的水平拆分和垂直拆分的相关文章

数据库水平拆分和垂直拆分区别(以mysql为例)

数据库水平拆分和垂直拆分区别(以mysql为例) 案例: 简单购物系统暂设涉及如下表: 1.产品表(数据量10w,稳定) 2.订单表(数据量200w,且有增长趋势) 3.用户表 (数据量100w,且有增长趋势) 以mysql为例讲述下水平拆分和垂直拆分,mysql能容忍的数量级在百万静态数据可以到千万 垂直拆分: 解决问题: 表与表之间的io竞争 不解决问题: 单表中数据量增长出现的压力 方案: 把产品表和用户表放到一个server上 订单表单独放到一个server上 水平拆分: 解决问题: 单

MySQL 数据库表的水平拆分

优化数据库结构之数据库表的水平拆分 水平拆分后的每个表结构是相同的,有利于解决单表记录数量过多的问题. 拆分方法: 1 id执行hash运算 如果拆分成5个表,则使用mod(id, 5)取出0-4. 2 根据散列值把数据存到不同的表中. 问题: 1 跨分区表进行数据查询 2 统计及后台报表操作 解决方法: 前后端业务分离,前端查询分区表,后端统计时使用汇总表. 参考资料 数据库表的水平拆分 原文地址:https://www.cnblogs.com/WJQ2017/p/8505535.html

mysql的水平拆分和垂直拆分

转:http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这100亿中查找,会很慢很慢.如果将这一张表分成100份,每张表有1亿条,就小了很多,比如qq0,qq1,qq1...qq99表. 用户登录的时候,可以将用户的id%100,那么会得到0-99的数,查询表的时候,将表名qq跟取模的数连接起来,就构建了表名.比如123456789用户,取模的89,那么

mysql关于数据库表的水平拆分和垂直拆分

最初知道水平垂直分表的时候是刚参加工作不久的时候,知道了这个概念,但是公司用户量和数据量始终没上来,所以也没用到过,知道有一天到了一家新公司后,这些才被应用到实际开发中,这里我就大概说说关于水平和垂直的拆分. 分表的概念还是比较好理解的,就拿本网站的评论表展开讲讲,源于数据量较大,当评论表有CURD操作时,单张表表现的可能有些力不从心,当然这里还能引申出关于读写速度的其他好多概念:数据库读写分离,NoSql等等. 垂直拆分:顾名思义是将表垂直着给拆掉,即:(下面是省略掉字段的一个表) +----

关于数据库表的水平拆分和垂直拆分

垂直拆分 垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表 通常我们按以下原则进行垂直拆分: 把不常用的字段单独放在一张表; 把text,blob等大字段拆分出来放在附表中; 经常组合查询的列放在一张表中; 垂直拆分更多时候就应该在数据表设计之初就执行的步骤,然后查询的时候用jion关键起来即可; 水平拆分 水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放. 水平拆分的一些技巧 1. 拆分原则 通常情况下,我们使用取模的方式来进行

redis和memcached在应用中的架构:水平拆分和垂直拆分

redis和memcached,这两个都是当今非常火的内存数据库,要论流行程度,目前redis用的最多,性能上来讲,如果你把redis的aof和rdb功能全部禁用,只是把redis当做一个缓存来用的话,redis和mencached性能上差不了多少,我相信用redis的不大可能只是用它的缓存功能吧? 这篇文章主要的目的是讲讲redis和memcached的垂直拆分和水平拆分,这里我以redis进行举例,写起来方便点. 一:垂直拆分 redis的垂直拆分实际上和mysql的垂直拆分思路差不多,我们

一分钟掌握数据库垂直拆分

一.缘起 当数据库的数据量非常大时,水平切分和垂直拆分是两种常见的降低数据库大小,提升性能的方法.假设有用户表: user( uid bigint, name varchar(16), pass varchar(16), age int, sex tinyint, flag tinyint, sign varchar(64), intro varchar(256) -); 水平切分是指,以某个字段为依据(例如uid),按照一定规则(例如取模),将一个库(表)上的数据拆分到多个库(表)上,以降低单

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

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

数据库的水平分割和垂直分割

在数据库操作中,我们常常会听说这两个词语:水平分割和垂直分割.那么到底什么是数据库的水平分割,什么是数据库的垂直分割呢?本文我们就来介绍一下这部分内容. 1.水平分割: 按记录进分分割,不同的记录可以分开保存,每个子表的列数相同. 水平分割通常在下面的情况下使用: A 表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度. B 表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用. C需要把数据