`
hudeyong926
  • 浏览: 2017187 次
  • 来自: 武汉
社区版块
存档分类
最新评论

mysql 水平分表的设计

阅读更多

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法。目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解。

首先,我们需要想好到底分多少个表,前提当然是满足应用。这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个 表,其取值也很好做,就是对10进行取模。另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了。

好了,先来创建表吧,代码如下http://hudeyong926.iteye.com/blog/1845997

set @field_list ='
`id` BIGINT( 20 ) NOT NULL ,
`subject` VARCHAR( 200 ) NOT NULL ,
`content` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
';  
call branch_table('article', @field_list, 9, 1);
CREATE TABLE `test`.`article_9` (
`id` BIGINT( 20 ) NOT NULL ,
`subject` VARCHAR( 200 ) NOT NULL ,
`content` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci 

 好了10个表创建完毕了,需要注意的是,这里的id不能设为自增,而且所有的表结构必须一致,包括结构,类型,长度,字段的顺序都必须一致 那么对于这个id如何取得呢?后面我会详细说明。现在,我们需要一个合并表,用于查询,创建合并表的代码如下

CREATE TABLE `test`.`article` (
`id` BIGINT( 20 ) NOT NULL ,
`subject` VARCHAR( 200 ) NOT NULL ,
`content` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=0 UNION=(`article_0`,`article_1`,`article_2`,`article_3`,`article_4`,`article_5`,`article_6`,`article_7`,`article_8`,`article_9`); 

 这里INSERT_METHOD=0在某些版本可能不工作,需要改成INSERT_METHOD=NO
注意,合并表也必须和前面的表有相同的结构,类型,长度,包括字段的顺序都必须一致 这里的INSERT_METHOD=0表示不允许对本表进行insert操作。好了,当需要查询的时候,我们可以只对article这个表进行操作就可以了,也就是说这个表仅仅只能进行select操作。合并表也可以不用创建通过10个表的union all 的存储过程代替http://hudeyong926.iteye.com/blog/1846357

那么对于插入也就是insert操作应该如何来搞呢,首先就是获取唯一的id了,这里就还需要一个表来专门创建id,代码如下

CREATE TABLE `test`.`create_id` (
`id` BIGINT( 20 ) NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE = MYISAM 

 也就是说,当我们需要插入数据的时候,必须由这个表来产生id值,我的php代码的方法如下

function get_AI_ID() {
    $sql  = "insert into create_id (id) values('')";
    $this->db->query($sql);
    return $this->db->insertID();
} 

 好了,现在假设我们要插入一条数据了,应该怎么操作呢?还是继续看代码吧

function new_Article() {
    $id  = $this->get_AI_ID();
    $table_name = $this->get_Table_Name($id);
    $sql = "insert into {$table_name} (id,subject,content) values('{$id}','测试标题','测试内容')";
    $this->db->query($sql);
}
/**
 * 用于根据id获取表名
 */
function get_Table_Name($id) {
    return 'article_'.intval($id)%10;
} 

 其实很简单的,对吧,就是先获取id,然后根据id获取应该插入到哪个表,然后就很简单了。

对于update的操作我想应该不需要再说了吧,无非是有了id,然后获取表名,然后进行update操作就好了。

7
5
分享到:
评论
3 楼 dumuqiao0317 2012-08-17  
这个经过测试了么,效果如何啊
2 楼 勇敢的核桃 2011-11-17  
楼主的照片大亮!令我对it女信心大增!
1 楼 yagas 2011-02-10  
虽然自己还没有来得急测试,但感觉这个方法不错。实现了对数据库的水平分割。

相关推荐

    mysql-7 (1).pdf

    9. 什么时候选择垂直分库、什么时候选择水平分表 10. 要明白分库分表中会存在的问题 11. Mycat(录播) 12. sharding JDBC(直播)课程目标 1. 了解服务器层面的性能优化 1. 硬件优化 2. Linux对应MySQL支持相关优化...

    Mysql数据库优化笔记(细节决定成败)

    c: 分表技术(水平分割、垂直分割) d: 读写[写: update/delete/add]分离 e: 存储过程 [模块化编程,可以提高速度] f: 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ] g: mysql服务器硬件升级 h: 定时的去...

    mysql优化笔记.doc

    c: 分表技术(水平分割、垂直分割) d: 读写[写: update/delete/add]分离 e: 存储过程 [模块化编程,可以提高速度] f: 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ] g: mysql服务器硬件升级 h: 定时的去...

    mysql面试题(涉及索引、事务、锁)

    说说分库与分表设计 分库与分表带来的分布式困境与应对之策(如何解决分布式下的分库分表,全局表?) 说说 SQL 优化之道 MySQL遇到的死锁问题、如何排查与解决 索引类别(B+树索引、全文索引、哈希索引)、索引的...

    mysql笔记,mysql优化图解

    c: 分表技术(水平分割、垂直分割) d: 读写[写: update/delete/add]分离 e: 存储过程 [模块化编程,可以提高速度] f: 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ] g: mysql服务器硬件升级 h: 定时的去...

    10道精选MySQL面试题

    10道精选MySQL面试题: 请简述B树和B+树在MySQL数据库索引中的应用,并解释为什么InnoDB存储引擎选择使用B+树作为索引结构? 在什么情况下,查询优化器会选择...如果业务需要进行水平拆分,你将如何设计分库分表策略?

    韩顺平mysql优化笔记.doc

    韩顺平mysql优化笔记.doc Mysql数据库的优化技术 对mysql优化时一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) ...c: 分表技术(水平分割、垂直分割) d: 读写[写: update/delete/add]分离

    Mysql优化资料

    c: 分表技术(水平分割、垂直分割) d: 读写[写: update/delete/add]分离 e: 存储过程 [模块化编程,可以提高速度] f: 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ] g: mysql服务器硬件升级 h: 定时的去...

    MYSQL数据库数据拆分之分库分表总结

    单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到。 数据存储演进思路二:单库多表 随着用户数量的增加,user表的数据量会越来越大,当数据量达到...

    MYSQL 数据库水平切分的实现原理解析

    随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来...

    单KEY业务,数据库水平切分架构实践

    用户前台侧,“建立非uid属性到uid的映射关系”最佳实践: ...• 可以采用数据冗余的设计方式 • 可以采用“外置索引”(例如ES搜索系统)或者“大数据处理”(例如HIVE)来满足后台变态的查询需求

    数据库分库技巧

    数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 关键字: 水平切分,分库,分表,主从,集群 第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一...

    TiDB架构及设计实现

    高度兼容MySQL大多数情况下,无需修改代码即可从MySQL轻松迁移至TiDB,分库分表后的MySQL集群亦可通过TiDB工具进行实时迁移。水平弹性扩展通过简单地增加新节点即可实现TiDB的水平扩展,按需扩展吞吐或存储,轻松...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    水平伸缩 集群 分片 Key-hash 异步 一致性hash 消峰 分库分表 锁 悲观锁 乐观锁 行级锁 分布式锁 分区排队 一致性 一致性算法 paxos zab nwr raft gossip 柔性事务(TCC) 一致性原理 CAP ...

    MySQL数据库优化技术概述

    对于一个以数据库为中心的应用,数据库的优化直接影响到程序的性能,因此数据库性能至关重要。...  3、分表技术:  水平分割  垂直分割  4、读写分离:  写:update/delete/insert  5、存储过程

    PingCAP TiDB 中文技术手册-2017

    • SQL 支持(TiDB 是 MySQL 兼容的) • 水平线性弹性扩展 • 分布式事务 • 跨数据中心数据强一致性保证 • 故障自恢复的高可用 TiDB 的设计目标是 100% 的 OLTP 场景和 80% 的 OLAP 场景。 TiDB 对业务没有任何...

    PingCAP TiDB 中文技术手册 2017 pdf

    • SQL 支持(TiDB 是 MySQL 兼容的) • 水平线性弹性扩展 • 分布式事务 • 跨数据中心数据强一致性保证 • 故障自恢复的高可用 TiDB 的设计目标是 100% 的 OLTP 场景和 80% 的 OLAP 场景。 TiDB 对业务没有任何...

    理解TIDB架构设计

    随着互联网的飞速发展,业务量可能在... 要想能做到水平扩展,唯一的方法就业务层的分库分表或者使用中间件等方案。但是,这些中间层方案也有很大局限性,执行计划不是最优,分布式事务,跨节点 join,扩容复杂等。

    数据库优化详解

    分表分库 (水平分割,垂直分割) 主从复制、读写分离 SQL 调优 对 MySQL 配置优化 (配置最大并发数 my.ini, 调整缓存大小) 定时清除不需要的数据,定时进行碎片整理 二、具体优化方案 (一)数据库设计—三大范式、...

Global site tag (gtag.js) - Google Analytics