mysql关于数据库表的水平拆分和垂直拆分
分表的概念还是比较好理解的,就拿本网站的评论表展开讲讲,源于数据量较大,当评论表有CURD操作时,单张表表现的可能有些力不从心,当然这里还能引申出关于读写速度的其他好多概念:数据库读写分离,NoSql等等.
垂直拆分:
顾名思义是将表垂直着给拆掉,即:(下面是省略掉字段的一个表)
- +--------+---------+--------+--------+-------+---------+---------+--------+-----+-------------+--------+-----------+------+--------+
- | userid | groupid | areaid | amount | point | modelid | message | islock | vip | overduedate | siteid | connectid | from | mobile |
- +--------+---------+--------+--------+-------+---------+---------+--------+-----+-------------+--------+-----------+------+--------+
- | 1 |
5 | 0 | 0.00 | 50 | 10 | 0 | 0 | 1 | 0 | 1 | | | |- +--------+---------+--------+--------+-------+---------+---------+--------+-----+-------------+--------+-----------+------+--------+
比如说一个用户表有很多的属性,关联了很多数据,如果放到同一个表里面的话查询是方便了,但是效率不行,所以这里就是用到了垂直拆表:
拆成如下:
- +--------+---------+--------+--------+-------+---------+---------+
- | userid | groupid | areaid | amount | point | modelid | message |
- +--------+---------+--------+--------+-------+---------+---------+
- | 1 | 5 | 0 | 0.00 | 50 | 10 | 0 |
- +--------+---------+--------+--------+-------+---------+---------+
- 和
- +--------+--------+-----+-------------+--------+-----------+------+--------+
- | userid | islock | vip | overduedate | siteid | connectid | from | mobile |
- +--------+--------+-----+-------------+--------+-----------+------+--------+
- | 1 | 0 | 1 | 0 | 1 | | | |
- +--------+--------+-----+-------------+--------+-----------+------+--------+
- 把常用的字段放一个表,不常用的放一个表
- 把字段比较大的比如text的字段拆出来放一个表里面
- 使用的话是根据具体业务来拆,查询时使用多表联查,可以再配合redis存储
水平拆分:
顾名思义是将表数据水平的拆掉,即:
- 表0 user_0
- +--------+---------+--------+--------+-------+---------+---------+
- | userid | groupid | areaid | amount | point | modelid | message |
- +--------+---------+--------+--------+-------+---------+---------+
- | 1 | 5 | 0 | 0.00 | 50 | 10 | 0 |
- +--------+---------+--------+--------+-------+---------+---------+
- 表1 user_1
- +--------+---------+--------+--------+-------+---------+---------+
- | userid | groupid | areaid | amount | point | modelid | message |
- +--------+---------+--------+--------+-------+---------+---------+
- | 1 | 5 | 0 | 0.00 | 50 | 10 | 0 |
- +--------+---------+--------+--------+-------+---------+---------+
- 表2 user_2
- +--------+---------+--------+--------+-------+---------+---------+
- | userid | groupid | areaid | amount | point | modelid | message |
- +--------+---------+--------+--------+-------+---------+---------+
- | 1 | 5 | 0 | 0.00 | 50 | 10 | 0 |
- +--------+---------+--------+--------+-------+---------+---------+
- .
- .
- .
- 表9 user_9
- +--------+---------+--------+--------+-------+---------+---------+
- | userid | groupid | areaid | amount | point | modelid | message |
- +--------+---------+--------+--------+-------+---------+---------+
- | 1 | 5 | 0 | 0.00 | 50 | 10 | 0 |
- +--------+---------+--------+--------+-------+---------+---------+
当然这里不一定要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关于数据库表的水平拆分和垂直拆分的更多相关文章
- 数据库水平拆分和垂直拆分区别(以mysql为例)
数据库水平拆分和垂直拆分区别(以mysql为例) 数据库水平拆分和垂直拆分区别(以mysql为例) 案例: 简单购物系统暂设涉及如下表: 1.产品表(数据量10w,稳定) 2.订单表(数据 ...
- mysql数据库的水平拆分与垂直拆分
近端时间在面试,发现很多面试官或者面试都把数据的水平拆分合垂直拆分给搞混了,今天特意写了一篇博客来说说水平拆分和垂直拆分希望对程序猿们有所帮助. 数据库水平与垂直拆分: 垂直(纵向)拆分:是指按功能模 ...
- mysql的水平拆分和垂直拆分
转:http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从 ...
- MySQL 水平拆分与垂直拆分详解
前言:说到优化mysql,总会有这么个回答:水平拆分,垂直拆分,那么我们就来说说什么是水平拆分,垂直拆分. 一.垂直拆分 说明:一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将 ...
- mysql的水平拆分和垂直拆分 (转)
http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这1 ...
- MYSQL水平拆分与垂直拆分
目前很多互联网系统都存在单表数据量过大的问题,这就降低了查询速度,影响了客户体验.为了提高查询速度,我们可以优化sql语句,优化表结构和索引,不过对那些百万级千万级的数据库表,即便是优化过后,查询速度 ...
- MySQL更改数据库表的存储引擎
MySQL更改数据库表的存储引擎 1.查看表的原存储引擎 show create table user; 'user', 'CREATE TABLE `user` (\n `id` int(11) N ...
- MySQL查看数据库表容量大小
本文介绍MySQL查看数据库表容量大小的命令语句,提供完整查询语句及实例,方便大家学习使用. 1.查看所有数据库容量大小 select table_schema as '数据库', sum(table ...
- MySQL中将数据库表名修改成大写的存储过程
原文:MySQL中将数据库表名修改成大写的存储过程 MySQL中将数据库表名修改成大写的存储过程 创建存储过程的代码: DROP PROCEDURE IF EXISTS uppercaseTablen ...
随机推荐
- Java并发编程原理与实战四十一:重排序 和 happens-before
一.概念理解 首先我们先来了解一下什么是重排序:重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段. 从Java源代码到最终实际执行的指令序列,会分别经历下面3种重排序,如下图 ...
- iscroll demo
下面是自己找网上资料写的一个小demo,基础的属性和方法都有用到,但是用法还不是很标准,github上的demo用法很标准,外面一个wrapper,里面还得有一个scroller,如果要做跑马灯效果还 ...
- 知识笔记:jQuery 事件对象属性小结
使用事件自然少不了事件对象.因为不同浏览器之间事件对象的获取,以及事件对象的属性都有差异,导致我们很难跨浏览器使用事件对象.jQuery中统一了事件对象,当绑定事件处理函数时,会将jQuery格式化后 ...
- func_get_args()获取参数
php中func_get_args()可以获取多个参数,讲多个参数放在数组里面. <?php function show() { $attr = func_get_args();//获取输入的参 ...
- pywin32记录备忘
项目地址:http://sourceforge.net/projects/pywin32/ 文档地址:http://docs.activestate.com/activepython/2.7/pywi ...
- springcloud的Turbine配置监控多个服务的一些坑!!!!InstanceMonitor$MisconfiguredHostException,No message available","path":"/actuator/hystrix.stream,页面不显示服务或者一直loading
踩了几个小时坑,使用仪表盘监控单个服务的时候很容易,但是一到多个服务,瞬间坑就来了,大概碰到下面三个: 1InstanceMonitor$MisconfiguredHostException, No ...
- 使用隐藏form表单下载文件,解决url方式下载,由于环境问题而限制url长度,满足不了所有的需求!
一 对于某些环境导出是直接用wiondow.href=url直接导出下载,有些业务需求,如员工档案等字段比较多的时候,全选导出就会引发异常,由于Nginx转发长度限制的问题, 如果运维不愿意改变环境, ...
- python(32):多进程(2) multiprocessing
python 多线程:多线程 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU核心. Python提供了非常好用的多进程包multiprocessing,你只需要 ...
- 5 - django-csrf-session&cookie
目录 1 CSRF跨站请求伪造 1.1 CSRF攻击介绍及防御 1.2 防御CSRF攻击 1.2.1 验证 HTTP Referer 字段 1.2.2 在请求地址中添加 token 并验证 1.2.3 ...
- verilog中wire与reg类型的区别
每次写verilog代码时都会考虑把一个变量是设置为wire类型还是reg类型,因此把网上找到的一些关于这方面的资料整理了一下,方便以后查找. wire表示直通,即只要输入有变化,输出马上无条件地反映 ...