最初知道水平垂直分表的时候是刚参加工作不久的时候,知道了这个概念,但是公司用户量和数据量始终没上来,所以也没用到过,知道有一天到了一家新公司后,这些才被应用到实际开发中,这里我就大概说说关于水平和垂直的拆分.

分表的概念还是比较好理解的,就拿本网站的评论表展开讲讲,源于数据量较大,当评论表有CURD操作时,单张表表现的可能有些力不从心,当然这里还能引申出关于读写速度的其他好多概念:数据库读写分离,NoSql等等.

垂直拆分:
顾名思义是将表垂直着给拆掉,即:(下面是省略掉字段的一个表)

  1. +--------+---------+--------+--------+-------+---------+---------+--------+-----+-------------+--------+-----------+------+--------+
  2. | userid | groupid | areaid | amount | point | modelid | message | islock | vip | overduedate | siteid | connectid | from | mobile |
  3. +--------+---------+--------+--------+-------+---------+---------+--------+-----+-------------+--------+-----------+------+--------+
  4. |      1 |
         
    5 |      0 |   0.00 |    50 |      10 |       0 |      0 |   1 |           0 |      1 |           |      |        |
  5. +--------+---------+--------+--------+-------+---------+---------+--------+-----+-------------+--------+-----------+------+--------+

比如说一个用户表有很多的属性,关联了很多数据,如果放到同一个表里面的话查询是方便了,但是效率不行,所以这里就是用到了垂直拆表:
拆成如下:

  1. +--------+---------+--------+--------+-------+---------+---------+
  2. | userid | groupid | areaid | amount | point | modelid | message |
  3. +--------+---------+--------+--------+-------+---------+---------+
  4. |      1 |       5 |      0 |   0.00 |    50 |      10 |       0 |
  5. +--------+---------+--------+--------+-------+---------+---------+
  6. +--------+--------+-----+-------------+--------+-----------+------+--------+
  7. | userid | islock | vip | overduedate | siteid | connectid | from | mobile |
  8. +--------+--------+-----+-------------+--------+-----------+------+--------+
  9. |      1 |      0 |   1 |           0 |      1 |           |      |        |
  10. +--------+--------+-----+-------------+--------+-----------+------+--------+
  • 把常用的字段放一个表,不常用的放一个表
  • 把字段比较大的比如text的字段拆出来放一个表里面
  • 使用的话是根据具体业务来拆,查询时使用多表联查,可以再配合redis存储

水平拆分:
顾名思义是将表数据水平的拆掉,即:

  1. 表0 user_0
  2. +--------+---------+--------+--------+-------+---------+---------+
  3. | userid | groupid | areaid | amount | point | modelid | message |
  4. +--------+---------+--------+--------+-------+---------+---------+
  5. |      1 |       5 |      0 |   0.00 |    50 |      10 |       0 |
  6. +--------+---------+--------+--------+-------+---------+---------+
  7. 表1 user_1
  8. +--------+---------+--------+--------+-------+---------+---------+
  9. | userid | groupid | areaid | amount | point | modelid | message |
  10. +--------+---------+--------+--------+-------+---------+---------+
  11. |      1 |       5 |      0 |   0.00 |    50 |      10 |       0 |
  12. +--------+---------+--------+--------+-------+---------+---------+
  13. 表2 user_2
  14. +--------+---------+--------+--------+-------+---------+---------+
  15. | userid | groupid | areaid | amount | point | modelid | message |
  16. +--------+---------+--------+--------+-------+---------+---------+
  17. |      1 |       5 |      0 |   0.00 |    50 |      10 |       0 |
  18. +--------+---------+--------+--------+-------+---------+---------+
  19. .
  20. .
  21. .
  22. 表9 user_9
  23. +--------+---------+--------+--------+-------+---------+---------+
  24. | userid | groupid | areaid | amount | point | modelid | message |
  25. +--------+---------+--------+--------+-------+---------+---------+
  26. |      1 |       5 |      0 |   0.00 |    50 |      10 |       0 |
  27. +--------+---------+--------+--------+-------+---------+---------+

当然这里不一定要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的数据为历史数据,访问需求量会慢慢减小,而新表的数据访问量是很高的.

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

原文博客链接:http://www.yigangwu.com/index.php?m=content&c=index&a=show&catid=33&id=59
 点击打开链接

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

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

    数据库水平拆分和垂直拆分区别(以mysql为例) 数据库水平拆分和垂直拆分区别(以mysql为例)   案例:     简单购物系统暂设涉及如下表: 1.产品表(数据量10w,稳定) 2.订单表(数据 ...

  2. mysql数据库的水平拆分与垂直拆分

    近端时间在面试,发现很多面试官或者面试都把数据的水平拆分合垂直拆分给搞混了,今天特意写了一篇博客来说说水平拆分和垂直拆分希望对程序猿们有所帮助. 数据库水平与垂直拆分: 垂直(纵向)拆分:是指按功能模 ...

  3. mysql的水平拆分和垂直拆分

    转:http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从 ...

  4. MySQL 水平拆分与垂直拆分详解

    前言:说到优化mysql,总会有这么个回答:水平拆分,垂直拆分,那么我们就来说说什么是水平拆分,垂直拆分. 一.垂直拆分 说明:一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将 ...

  5. mysql的水平拆分和垂直拆分 (转)

    http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这1 ...

  6. MYSQL水平拆分与垂直拆分

    目前很多互联网系统都存在单表数据量过大的问题,这就降低了查询速度,影响了客户体验.为了提高查询速度,我们可以优化sql语句,优化表结构和索引,不过对那些百万级千万级的数据库表,即便是优化过后,查询速度 ...

  7. MySQL更改数据库表的存储引擎

    MySQL更改数据库表的存储引擎 1.查看表的原存储引擎 show create table user; 'user', 'CREATE TABLE `user` (\n `id` int(11) N ...

  8. MySQL查看数据库表容量大小

    本文介绍MySQL查看数据库表容量大小的命令语句,提供完整查询语句及实例,方便大家学习使用. 1.查看所有数据库容量大小 select table_schema as '数据库', sum(table ...

  9. MySQL中将数据库表名修改成大写的存储过程

    原文:MySQL中将数据库表名修改成大写的存储过程 MySQL中将数据库表名修改成大写的存储过程 创建存储过程的代码: DROP PROCEDURE IF EXISTS uppercaseTablen ...

随机推荐

  1. html中一些莫名的空格

    我们日常用编辑器编辑代码的时候,为了让代码的可读性更高,通常会有换行,空格或者tab键(bootstrap的规则中非常不建议这样做,不过为了方便,我还是比较习惯这样来缩进)的操作. 而这些也就造成了一 ...

  2. Redis学习三:Redis数据类型

    一.Redis的五大数据类型 1.String(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value.string类型是二进制安 ...

  3. 使用abcpdf将html转换成pdf文件

    ABCpdf.NET使用介绍 最新做一个项目需要生成pdf文档以供打印,研究决定使用abcpdf这款组件,先针对其使用方法做一个简单的总结介绍以给有需要的朋友做参考. 一. ABCpdf.NET简单介 ...

  4. 程序员 & 设计师都能用上的 75 份速查手册

    分享75份开发人员和设计师会用到的速查手册,由 vikas 收集整理,包括:jQuery.HTML.HTML5.CSS.CSS3.JavaScript.Photoshop .git.Linux.Jav ...

  5. 【微服务架构】SpringCloud之Ribbon

    一:Ribbon是什么? Ribbon是Netfix发布的开源项目,主要负责客户端的软件负载均衡算法,将Netfix的中间层连接在一起,Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等. ...

  6. 2016.5.57—— Remove Duplicates from Sorted List

    Remove Duplicates from Sorted List 本题收获: 指针: 不管什么指针在定义是就初始化:ListNode *head = NULL; 如果给head指针赋值为第一个no ...

  7. MeasureSpec介绍及使用详解

    一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求.一个MeasureSpec有大小和模式组成.他有三种模式: UNSPECIFIED ...

  8. Tomcat安装与优化

    Tomcat安装与优化 1.安装jdk环境 最新的JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downlo ...

  9. 关于Unity启动时间过长(启动黑屏时间长)的问题!!! 牛逼... 思路不错...

    http://blog.csdn.net/u012169685/article/details/52068809

  10. Windows 10安装MongoDB(安装&启动)

    Windows 10家庭中文版,MongoDB 3.6.3, 最近在学习Scrapy,可以却从未将scraped data存储到数据库中.在看过一些文档后,Scrapy会和MongoDB结合使用(还有 ...