近端时间在面试,发现很多面试官或者面试都把数据的水平拆分合垂直拆分给搞混了,今天特意写了一篇博客来说说水平拆分和垂直拆分希望对程序猿们有所帮助。

数据库水平与垂直拆分:

垂直(纵向)拆分:是指按功能模块拆分,比如分为订单库、商品库、用户库...这种方式多个数据库之间的表结构不同。

水平(横向)拆分:将同一个表的数据进行分块保存到不同的数据库中,这些数据库中的表结构完全相同。

数据表的水平与垂直拆分:

垂直拆分:按字段功能主次拆分,比如最常见的商品表、商品图片表、商品详细信息...表与表之间的结构不同

水平拆分:同数据库的水平拆分原理一样主要是将数据进行拆分保存到不同的表当中,这些表的结构完全相同。、

使用用垂直拆分要主要看系统是否适合这种拆分方式,如系统可分为用户系统,商品系统、订单系统等这些业务比较明确的比较适合使用垂直拆分,垂直拆分能很好分散数据库压力。业务模块不清晰,模块耦合度较高的系统并不适合垂直拆分。垂直拆分并不能彻底解决所有的压力问题,例如有一张8000w的订单表而且订单随着时间还在一直增加,操作起这张订单表压力依然很大,如我们需要在这个表中增加(insert)一条新的数据,insert完毕后,数据库会针对这张表重新建立索引,8000w行数据建立索引的系统开销还是不容忽视的,这类情况就可以使用到水平拆分了,可以将表分成100个table,table_001一直到table_100,8000w数据平均分下来就是80万的数据(经过实际测试mysql数据量达到400w的时候性能明显降低,故而应将单个mysql的数据量控制在300W以内),这时候我们向一张只有80w行数据的table中insert数据后建立索引的时间就会呈数量级的下降,极大了提高了DB的运行时效率,提高了DB的并发量,这种拆分就是水平(横向)拆分

数据库拆的实现方式:

垂直拆分,拆分方式实现起来比较简单,根据表名访问不同的数据库就可以了这里不多讲。横向拆分的规则很多,这里总结了以下几点:

1、顺序拆分:例如订单表可以按订单的日期按年份才分,2016年的放在db1中,2017年的db2,以此类推。当然也可以按主键标准拆分。

优点:可部分迁移

缺点:数据分布不均,可能2016年的订单有200W,2017年的有800W。

2、hash取模分: 例如订单表对user_id进行hash(或者如果user_id是数值型的话直接使用user_id的值也可),然后用一个特定的数字,比如应用中需要将一个数据库切分成4个数据库的话,我们就用4这个数字对user_id的hash值进行取模运算,也就是user_id%4,这样的话每次运算就有四种可能:结果为1的时候对应DB1;结果为2的时候对应DB2;结果为3的时候对应DB3;结果为0的时候对应DB4,这样一来就非常均匀的将数据分配到4个DB中。

优点:数据分布均匀

缺点:数据迁移的时候麻烦;不能按照机器性能分摊数据 。

3、在认证库中保存数据库配置,就是建立一个DB,这个DB单独保存user_id到DB的映射关系,每次访问数据库的时候都要先查询一次这个数据库,以得到具体的DB信息,然后才能进行我们需要的查询操作。

优点:灵活性强,一对一关系

缺点:每次查询之前都要多一次查询,会造成一定的性能损失。

ps:暂时只想到这些希望对大家有帮助,如果有更好的方法欢迎留言区评论交流

mysql数据库垂直切分_mysql数据库的水平拆分与垂直拆分相关推荐

  1. mysql 数据表格切分_MySQL数据库垂直和水平切分

    replication的限制:一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我们还是会面临到扩展瓶颈.数据切分(sharding):通过某种特定的条件,将我们存放在同一个数据库中 ...

  2. mysql 数据库切分_mysql数据库切分

    一.数据的垂直切分 概念:数据的垂直切分,也可以称之为纵向切分.将不同的表分散到不同的数据库主机中. 一个应用系统,总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就 ...

  3. mysql数据库表分区_MySQL数据库之MySQL的分区和分表详解

    本文主要向大家介绍了MySQL数据库之MySQL的分区和分表详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 1. 分区 MySQL中的分区是指将一个数据表按照某种规则(如时 ...

  4. 初识mysql数据字段属性_MySQL数据库~~~~初识、基础数据类型

    一 数据库初识 1.1 什么是数据库 数据库(DataBase,简称DB),简而言之可视为电子化的文件柜----存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库 ...

  5. mysql实训报告_mysql数据库技术》实验报告.doc

    mysql数据库技术>实验报告 MySQL数据库技术实验报告 系 别 班 级 学 号 姓 名 地点 地点机房 课程名称 MySQL数据库技术 实验名称 实验1 MySQL的使用 实 验 过 程 ...

  6. mysql数据库物理备份_MySQL数据库之xtrabackup物理备份(一)

    (1)备份开始时会开启一个后台检测进程,实时检测mysql redo(已提交的事务)的变化,一旦发现redo中有新日志写入,立刻将日志记入后台日志文件xtrabackup_log中, (2)复制Inn ...

  7. mysql 导出dmp文件_Mysql数据库的各种命令:

    一.连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysqlbin,再键入命令mysql -u root ...

  8. mysql数据库试题下载_MYSQL数据库2013-2014学年考试试卷

    石河子大学MYSQL数据库2013-2014学年考试试卷 8.创建表时,不允许某列为空可以使用: ( A ) A.NOT NULL B.NO NULL C.NOT BLANK D.NO BLANK 9 ...

  9. MySQL数据库的总结_MySQL数据库应用总结(三)—MySQL数据库的基本操作

    SQL语法预览: 查看所有数据库:[show databases; ] 创建数据库:[create database 数据库名;] 查看所创建的数据库:[show create database 数据 ...

最新文章

  1. python安装虚拟环境virtualenv
  2. 带有128KB缓存的AD7606模拟采集板
  3. python开发的模型部署_使用Python部署机器学习模型的10个实践经验
  4. 组合模式测试组合模式(Composite Pattern)
  5. java se和java_Java:改进了Java SE 6和Java SE 7的客户端和桌面部分!
  6. nginx做代理服务
  7. IDL编程实现拟合树的圆心代码
  8. 教程:利用艾斯PM3GUI软件助手,帮你查IC卡漏洞
  9. macd底背离的python_Python量化交易之MACD'顶底背离'形态的实现,自动化交易!
  10. Android kotlin和java反编译后的smali 有什么区别?
  11. 31岁才转行程序员,目前34了,我来说说我的经历和一些感受吧...
  12. 10步搞定App内测发布(蒲公英内测平台)
  13. 乐行学院Redis5学习教程 第一章redis5的安装
  14. 【Python网络编程】爬取百度贴吧、小说内容、豆瓣小说、Ajax爬微博、多线程爬淘宝
  15. MySQL数据库密码忘了,怎么修改密码,找回密码。
  16. 交换机基本介绍(分类、性能指标、硬件构成及工作方式)
  17. ceph kernel rbd (二): rbd map , rbd unmap
  18. 毕设学习笔记(1):经典DV-Hop算法(MATLAB)
  19. ICAP client 获取ICAP server 的Options
  20. Java实现指定目录下的文件查找

热门文章

  1. c语言逻辑错误调试,c语言程序,现在出现逻辑错误,哪位高手指点下啊。。。...
  2. hsv白色h值是多少_使用Global Mapper给建筑轮廓SHP数据赋予高程值
  3. Arduino--IIC详解
  4. 计算机模块考试注意事项,常考计算机模块考试操作注意事项.doc
  5. oracle set parseonly on,Set noexec on 与 Set parseonly on的区别及SQL语法检查
  6. fastjson反序列化漏洞研究(下)
  7. 第1节 yarn:15、关于yarn中常用的参数设置
  8. Vue+axios(interceptors) 实现http拦截 + router路由拦截 (双拦截)+ 请求自带loading效果...
  9. 负载测试与压力测试的区别
  10. 当singleton Bean依赖propotype Bean,可以使用在配置Bean添加look-method来解决