- 浏览: 293112 次
文章分类
- 全部博客 (148)
- Shell (2)
- Python (4)
- Java (31)
- Javascript (4)
- Android (7)
- SQL优化 (0)
- Linux (5)
- webOS (4)
- MySQL (18)
- memcach redis (1)
- memcach (0)
- redis (3)
- memcache (2)
- svn (1)
- UED (1)
- 网络 (1)
- virtual box (1)
- git (1)
- Gitosis (1)
- 云计算 (2)
- 12306 (1)
- google (1)
- spdy (1)
- nginx (1)
- tomcat (2)
- SSL (2)
- lucene (2)
- 空间搜索 (1)
- lzo (1)
- 数据压缩 (1)
- ios (1)
- maven (1)
- elasticsearch (1)
- scribe (1)
- flume (1)
- jni (1)
- jna (1)
- hadoop (2)
- 大数据 (1)
最新评论
-
aa80303857:
不错,学习了。互相关注一下。
Sitemesh学习笔记 -
xiaozang:
...
关于nginx的rewrite重写规则 -
coderuncle:
楼主有没有研究过cloudera flume和apache f ...
scribe,flume -
奔跑的犀牛:
...
linux下自动启动mysql -
lsn_1212:
网上装svn的资源太多了,这个挺好的,说的挺全的。
SVN Server安装部署攻略(Linux+SubVersion+Apache)
在大中型项目中,在数据库设计的时候,考虑到数据库最大承受数据量,通常会把数据库或者数据表水平切分,以降低单个库,单个表的压力。我这里介绍两个我们项目中常用的数据表切分方法。当然这些方法都是在程序中使用一定的技巧来路由到具体的表的。首先我们要确认根据什么来水平切分?在我们的系统(SNS)中,用户的UID贯穿系统,唯一自增长,根据这个字段分表,再好不过。
方法一:使用MD5哈希
做法是对UID进行md5加密,然后取前几位(我们这里取前两位),然后就可以将不同的UID哈希到不同的用户表(user_xx)中了。
function getTable( $uid ){ $ext = substr ( md5($uid) ,0 ,2 ); return "user_".$ext; }
通过这个技巧,我们可以将不同的UID分散到256中用户表中,分别是user_00,user_01 …… user_ff。因为UID是数字且递增,根据md5的算法,可以将用户数据几乎很均匀的分别到不同的user表中。
但是这里有个问题是,如果我们的系统的用户越来越多,势必单张表的数据量越来越大,而且根据这种算法无法扩展表,这又会回到文章开头出现的问题了。
方法二:使用移位
具体方法是:
public function getTable( $uid ) { return "user_" . sprintf( "%04d", ($uid >> 20) ); }
这里,我们将uid向右移动20位,这样我们就可以把大约前100万的用户数据放在第一个表user_0000,第二个100万的用户数据放在第二个表user_0001中,这样一直下去,如果我们的用户越来越多,直接添加用户表就行了。由于我们保留的表后缀是四位,这里我们可以添加1万张用户表,即user_0000,user_0001 …… user_9999。一万张表,每张表100万数据,我们可以存100亿条用户记录。当然,如果你的用户数据比这还多,也不要紧,你只要改变保留表后缀来增加可以扩展的表就行了,如如果有1000亿条数据,每个表存100万,那么你需要10万张表,我们只要保留表后缀为6位即可。
上面的算法还可以写的灵活点:
/** * 根据UID分表算法 * @param int $uid //用户ID * @param int $bit //表后缀保留几位 * @param int $seed //向右移动位数 */ function getTable( $uid , $bit , $seed ){ return "user_" . sprintf( "%0{$bit}d" , ($uid >> $seed) ); }
总结:
上面两种方法,都要对我们当前系统的用户数据量做出可能最大的预估,并且对数据库单个表的最大承受量做出预估。
比如第二种方案,如果我们预估我们系统的用户是100亿,单张表的最优数据量是100万,那么我们就需要将UID移动20来确保每个表是100万的数据,保留用户表(user_xxxx)四位来扩展1万张表。
又如第一种方案,每张表100万,md5后取前两位,就只能有256张表了,系统总数据库就是:256*100万;如果你系统的总数据量的比这还多,那你实现肯定要MD5取前三位或者四位甚至更多位了。
两种方法都是将数据水平切分到不同的表中,相对第一种方法,第二种方法更具扩展性。。。
发表评论
-
mysql binlog分析工具
2013-01-26 22:45 1534https://github.com/tangfl/jbinl ... -
MySQL 百万级分页优化(Mysql千万级快速分页)
2012-12-07 22:30 0以下分享一点我的经验 一般刚开始学SQL的时候,会这样写 ... -
mysql共享表空间和独立表空间
2012-12-07 22:12 0innodb表的数据结构 innodb这种引擎 ... -
InnoDB之表空间
2012-12-07 22:12 0innoDB是MySQL的重要存储引擎,为数据提供了很好 ... -
MySQL 系统架构 说明
2012-12-07 22:07 901说明:本文转自 简朝阳(MySQL ACE)的 《MyS ... -
基于InnoDB存储引擎的mysql数据库表结构详解
2012-12-07 22:05 3605前言 前一篇文章基于InnoDB存储引擎的mysql数 ... -
MySQL技术内幕:InnoDB存储引擎读书笔记(下)
2012-12-07 21:58 1358第六章、锁 锁是区别文件系统和数据库系统的一个关键 ... -
MySQL技术内幕:InnoDB存储引擎读书笔记(中)
2012-12-07 21:54 1536第四章、表 4.1 ... -
MySQL技术内幕:InnoDB存储引擎读书笔记(上)
2012-12-07 21:53 1656第一章、mysql体系结构和存储引擎 1.1、数据 ... -
由12306.cn谈谈网站性能技术
2012-10-17 16:35 96512306.cn网站挂了,被 ... -
mysql主从复制(半同步方式)
2012-08-15 12:22 3038一、半同步复制原理介 ... -
淘宝开源 mysql 插件,让mysql像nosql一样使用
2012-06-29 17:28 1217http://rdc.taobao.com/team/jm/a ... -
mysql的几个主要分支
2012-06-29 17:11 1367http://www.percona.com/software ... -
mysql 添加用户,并对数据库授权
2011-12-07 11:46 1054use mysql; insert into user ... -
MySQL server has gone away 问题的解决方法
2011-04-11 11:27 10161、应用程序(比如PHP)长时间的执行批量的MYSQL语句。 ... -
DRBD 提升了 MySQL 的集群能力
2011-03-02 23:00 1025前几天 MySQL 站点上 ... -
快速/简单实现mysql数据库集群(mysql cluster)
2011-03-02 22:58 1865最近一直在研究mysql的高可用性和负载均衡技术,对于数据库/ ... -
MySQL复制实现互为主从双机热备
2011-03-02 22:55 1870A B 为两台MySQL服务器,均开启二进制日志,数据库版本 ... -
Mysql, DRBD, Heartbeat 实现数据库复制和数据库系统HA
2011-03-02 22:51 1548使用了两种技术来实现数据库之间的复制和高可用性(HA) DR ... -
Drbd + heartbeat + mysql replication来构建mysql的高可用性
2011-03-02 22:50 1412A(M)[192.168.33.11\192.168.43.1 ...
相关推荐
【数据库水平切分实现原理解析】 随着互联网的发展,海量数据的存储与访问已成为系统设计的关键挑战。面对每天数十亿的页面访问量(PV),数据库的高负载问题日益突出,严重影响了系统的稳定性和扩展性。水平切分...
### MySQL 数据库水平切分的实现原理解析 #### 第1章 引言 随着互联网技术的迅猛发展,海量数据的存储与访问已成为系统设计的关键挑战之一。在高流量应用场景中,例如大型电商平台或社交网络平台,每日数十亿次页面...
**水平切分**则是根据数据本身来划分,通常基于某个特定字段,如用户ID`userid`,按照一定的规则(如取模)将数据分散到多个表或数据库实例上。这使得每个实例的负载更小,性能得到提升。例如,可以使用范围法,如...
### 单KEY业务,数据库水平切分架构实践 #### 用户前台侧:“建立非uid属性到uid的映射关系”最佳实践 在面对大量的用户数据时,为了提高数据库系统的响应速度和处理能力,需要采取合适的数据库水平切分策略。水平...
mysql水平扩展">DB 数据库水平切分的实现原理解析 MySQL 5 5 rpm格式 在Linux上安装 mysql memcached UDF安装使用 MySQL Proxy应用入门 1 安装MySQL Proxy MySQL Proxy应用入门 2 MySQL Proxy配置选项 MySQL Proxy...
- MySQL水平切分(分片) - Oracle分区 - Oracle物化视图 - 中间表方案 3. **索引与物化视图的设计** 4. **数据切分策略** #### 二、业务需求分析与切分 在进行数据库设计之前,首先要对业务需求有一个清晰的...
这是针对amoeba for mysql的一个具体案例,实现水平切分和读写分离
MySQL Proxy支持多种切分策略,包括垂直切分和水平切分,并且可以实现读写分离等功能。虽然MySQL Proxy提供了丰富的功能,但它并不直接支持SQL语法,需要开发者自己编写Lua脚本来实现特定的逻辑,这在一定程度上增加...
其中,水平切分通过将数据按照某种规则分散到多个数据库实例中,能够有效减轻单个数据库的压力,并提高整体系统的可用性和容错性。本文将重点介绍水平切分中的关键技术——分库、分表、主从复制、集群及负载均衡等,...
一般来说,简单的水平切分主要是将某个访问极其平凡的表再按照某个字段的某种规则来分散到多个表之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行...
水平切分是指将数据库分割成多个小的数据库,以便提高系统的可扩展性。 2. MySQL 集群拓扑结构 MySQL 集群可以有多种拓扑结构,例如: (1)一主多从结构:一个主服务器和多个从服务器。 (2)多主多从结构:多...
在MySQL中实现分库分表有多种方法,包括垂直分割和水平分割。 1. **垂直分割**:这种方法基于数据属性进行切分,将表中的列分为两个或更多个表。通常,我们将不常访问或者大容量的列移到另一个表中,这样可以减少主...
- **垂直/水平切分**:通过垂直或水平切分服务器或数据表来分散负载。 - **MySQL复制**:利用MySQL复制技术实现读写分离,提高读取性能。 - **负载均衡**:在复制的基础上,可以通过多个从服务器实现负载均衡。 - **...
在新浪的分布式数据库实践中,使用了Sharding策略来实现数据库的水平切分。Sharding是指将数据库按照一定的规则分割成多个小的数据库,每个小数据库都可以独立工作。这种策略可以提高数据库的性能和可扩展性。 在...
数据切分策略:根据具体业务需求选择合适的切分策略,常见的切分策略有水平切分、垂直切分和跨库查询。水平切分按照某个条件将数据行拆分到不同的数据库表中,例如按照用户 ID 的哈希值进行切分。垂直切分按照表的列...
14.3 数据的水平切分 14.4 垂直与水平联合切分的使用 14.5 数据切分及整合方案 14.6 数据切分与整合中可能存在的问题 14.7 小结 第15章 可扩展性设计之Cache与Search的利用 15.0 引言 15.1 可扩展设计的...
它在MySQL主从复制的基础上,实现了数据的切分,使单个数据库实例能够处理更大的负载,同时通过负载均衡策略确保了服务的稳定性。 Mycat的核心功能包括: 1. 数据分片:Mycat支持水平分片和垂直分片。水平分片是将...
针对大型互联网应用中出现的数据库高负载问题,提出了数据切分策略,包括水平切分、读写分离、负载均衡和集群方案等,以提升系统的稳定性和扩展性。 【标签】:互联网 【内容摘要】: 1. 数据切分策略 数据切分...
4. **数据切分配置**:在`rule.xml`中启用规则配置,指定垂直切分和水平切分的规则。 **注意事项** 除了Amoeba的配置,系统还需要对MySQL数据库进行主从同步的配置,以保持数据的一致性。主从同步通常涉及binlog...
为了解决这一问题,分布式数据库(分布式DB)方案应运而生,通过水平切分、垂直切分、主从复制(M-S)、集群和负载均衡等技术手段,有效地降低了单台数据库服务器的压力,提升了系统的整体性能和可用性。 1. **数据...