Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据库表的垂直拆分和水平拆分

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

作者头像
七点一刻
发布于 2023-03-09 07:09:05
发布于 2023-03-09 07:09:05
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

表的垂直拆分和水平拆分

垂直拆分

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

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

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

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

水平拆分

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

水平拆分的一些技巧

1. 拆分原则 通常情况下,我们使用取模的方式来进行表的拆分;比如一张有 400w 的用户表users,为提高其查询效率我们把其分成4张表users1,users2,users3,users4 通过用 ID 取模的方法把数据分散到四张表内Id%4+1 = [1,2,3,4] 然后查询,更新,删除也是通过取模的方法来查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$_GET['id'] = ,
% +  = ,  
$tableName = 'users'.'2'
Select * from users2 where id = ;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into uid_temp values(null);

得到自增的 ID 后,又通过取模法进行分表插入;

注意,进行水平拆分后的表,字段的列和类型和原表应该是相同的,但是要记得去掉 auto_increment 自增长

另外

  • 部分业务逻辑也可以通过地区,年份等字段来进行归档拆分;
  • 进行拆分后的表,只能满足部分查询的高效查询需求,这时我们就要在产品策划上,从界面上约束用户查询行为。比如我们是按年来进行归档拆分的,这个时候在页面设计上就约束用户必须要先选择年,然后才能进行查询;
  • 在做分析或者统计时,由于是自己人的需求,多点等待其实是没关系的,并且并发很低,这个时候可以用union把所有表都组合成一张视图来进行查询,然后再进行查询;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Create view users as select from users1 union select from users2 union.........

——摘自《表的垂直拆分和水平拆分》

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七点一刻的魔法书 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mysql水平拆分与垂直拆分的详细介绍 原
垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表 通常我们按以下原则进行垂直拆分:
wuweixiang
2018/08/14
2.1K0
MySQL 之分区分表
1、为什么要分表? 数据库数据越来越大,随之而来的是单个表中数据太多。以至于查询速度变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈。 mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。当出现这种情况时,我们可以考虑分表或分区。
小手冰凉
2020/06/04
1.7K0
MySQL 之分区分表
MySQL“被动”性能优化汇总!
当然,本篇也是关于性能优化的,那性能优化就应该一把梭子吗?还是要符合一些规范和原则呢?
磊哥
2020/08/11
6200
MySQL“被动”性能优化汇总!
数据库水平垂直拆分
一般水平拆分是根据表中的某一字段(通常是主键 ID )取模处理,将一张表的数据拆分到多个表中。这样每张表的表结构是相同的但是数据不同。
爱明依
2022/04/01
7450
实战 2000w 数据大表的优化过程,提供三种解决方案
当我们业务数据库表中的数据越来越多,如果你也和我遇到了以下类似场景,那让我们一起来解决这个问题
码猿技术专栏
2023/05/01
3K0
实战 2000w 数据大表的优化过程,提供三种解决方案
MyCat08——分片技术之垂直拆分
随着我们的系统用户不断增加,产出的内容和数据量将不断增长,单台数据库数据量因为过大,将会导致查询速率降低,严重影响用户体验。
用户8100582
2023/11/25
2500
实战彻底搞清分库分表(垂直分库,垂直分表,水平分库,水平分表)
关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。
大龄老码农-昊然
2021/04/28
21.5K0
实战彻底搞清分库分表(垂直分库,垂直分表,水平分库,水平分表)
要如何解决数据库拆分问题呢?
我们完成了系统的拆分,做好了负载均衡,并完成了配置中心。在请求量不太大的情况下,我们其实已经完成了系统的优化。等到后期业务继续扩张时,我们遇到的瓶颈就不再是系统,而是数据库了。那么要如何解决这个问题呢?
用户7365393
2021/09/26
7950
2020最新版MySQL数据库面试题(三)
select r.*,s.* from r full join s on r.c=s.c
码农编程进阶笔记
2021/07/20
6830
2020最新版MySQL数据库面试题(三)
数据库大表优化
当 MySQL 单表记录数过大时,数据库的 CRUD 性能会明显下降,一些常见的优化措施如下:
happyJared
2019/08/14
1.4K0
mysql分布式数据库的逻辑库、物理库和分库分表和TDDL图文详解
逻辑库/逻辑文件:给用户看的(即Database和Table就是我们常说的逻辑库的范畴) 物理库/物理文件:存储在计算机中的(即机器和Port就是我们常说的物理库的范畴。)
一个会写诗的程序员
2020/04/24
4.5K0
「mysql优化专题」优化之路高级进阶——表的设计及优化(6)
数据库范式是确保数据库结构合理,满足各种查询需要、避免数据库操作异常的数据库设计方式。满足范式要求的表,称为规范化表,范式产生于20世纪70年代初,一般表设计满足前三范式就可以,在这里简单介绍一下前三范式。
java进阶架构师
2018/08/15
8260
「mysql优化专题」优化之路高级进阶——表的设计及优化(6)
数据库分库分表思路
关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。
凯哥Java
2019/06/28
7390
分库分表常见问题和解决方案
分库分表是非常常见针对单个数据表数据量过大的优化方式,它的核心思想是把一个大的数据表拆分成多个小的数据表,这个过程也叫(数据分片),它的本质其实有点类似于传统数据库中的分区表,比如mysql和oracle都支持分区表机制。
终有救赎
2023/11/23
7610
分库分表常见问题和解决方案
ShardingSphere数据分片
坚持是一件比较难的事,坚持并不是自欺欺人的一种自我麻痹和安慰,也不是做给被人的,我觉得,坚持的本质并没有带着过多的功利主义,如果满是功利主义,那么这个坚持并不会长久,也不会有好的收获,坚持应该带着热爱,带着思想,把它当成习惯,但是并不是内卷,而是一种发自内心的喜欢和平实!希望我们都有自己的坚持,坚持写一篇文章,坚持爱一个人,坚持读一本书,坚持走向远方!
小四的技术之旅
2022/07/26
1.2K0
ShardingSphere数据分片
34. 谈谈为什么要拆分数据库?有哪些方法?
单体项目在构建之初,数据库的负载和数据量都不大,所以不需要对数据库做拆分,小型财务系统、文书系统、ERP系统、OA系统,用一个MySQL数据库实例基本就够用了。
用户11332765
2024/11/01
1140
34. 谈谈为什么要拆分数据库?有哪些方法?
数据库分库分表如何避免“过度设计”和“过早优化”
关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。
Bug开发工程师
2018/08/17
2K0
数据库分库分表如何避免“过度设计”和“过早优化”
Mysql - 数据库面试题打卡第三天
当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:
后端码匠
2021/08/19
5260
Java面试集锦(一)之数据库(mysql)
第一范式:列不可分,eg:【联系人】(姓名,性别,电话),一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF; 第二范式:有主键,保证完全依赖。eg:订单明细表【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName),Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID,不符合2NF; 第三范式:无传递依赖(非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况),eg:订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID),CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。
凯哥Java
2022/12/16
3280
Java面试集锦(一)之数据库(mysql)
【说站】mysql垂直分割是什么
垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。
很酷的站长
2022/11/23
4550
推荐阅读
相关推荐
mysql水平拆分与垂直拆分的详细介绍 原
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验