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

垂直拆分

垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表

通常我们按以下原则进行垂直拆分:

  1. 把不常用的字段单独放在一张表;
  2. 把text,blob等大字段拆分出来放在附表中;
  3. 经常组合查询的列放在一张表中;

垂直拆分更多时候就应该在数据表设计之初就执行的步骤,然后查询的时候用jion关键起来即可;

水平拆分

水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。

水平拆分的一些技巧

1. 拆分原则

通常情况下,我们使用取模的方式来进行表的拆分;比如一张有400W的用户表users,为提高其查询效率我们把其分成4张表users1,users2,users3,users4

通过用ID取模的方法把数据分散到四张表内Id%4+1 = [1,2,3,4]

然后查询,更新,删除也是通过取模的方法来查询

$_GET[‘id‘] = 17,
17%4 + 1 = 2,
$tableName = ‘users‘.‘2‘
Select * from users2 where id = 17;

在insert时还需要一张临时表uid_temp来提供自增的ID,该表的唯一用处就是提供自增的ID;

insert into uid_temp values(null);

得到自增的ID后,又通过取模法进行分表插入;
注意,进行水平拆分后的表,字段的列和类型和原表应该是相同的,但是要记得去掉auto_increment自增长

另外

部分业务逻辑也可以通过地区,年份等字段来进行归档拆分;

进行拆分后的表,只能满足部分查询的高效查询需求,这时我们就要在产品策划上,从界面上约束用户查询行为。比如我们是按年来进行归档拆分的,这个时候在页面设计上就约束用户必须要先选择年,然后才能进行查询;

在做分析或者统计时,由于是自己人的需求,多点等待其实是没关系的,并且并发很低,这个时候可以用union把所有表都组合成一张视图来进行查询,然后再进行查询;

Create view users as select from users1 union select from users2 union.........

原文地址:https://www.cnblogs.com/behindman/p/8727489.html

时间: 2024-11-05 06:12:49

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

数据库水平拆分和垂直拆分区别(以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等等. 垂直拆分:顾名思义是将表垂直着给拆掉,即:(下面是省略掉字段的一个表) +----

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

垂直拆分:顾名思义是将表垂直着给拆掉,即:(下面是省略掉字段的一个表)+--------+---------+--------+--------+-------+---------+---------+--------+-----+-------------+--------+-----------+------+--------+ | userid | groupid | areaid | amount | point | modelid | message | islock | vip | 

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

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

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

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

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

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

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

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