返回介绍

表的垂直拆分和水平拆分

发布于 2025-02-28 13:07:59 字数 1693 浏览 0 评论 0 收藏 0

垂直拆分

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

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

  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.........

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文