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

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分表创建

    2. **水平分表(Hash分片)**:根据某个字段的值(如用户ID)进行哈希运算,将数据均匀分布到多个表中。例如,假设我们有1000万用户,可以创建10个子表,用户ID为1-100万的用户在表1,100万-200万在表2,以此类推。...

    Mysql的水平分表与垂直分表的讲解

    MySQL数据库在处理大规模数据时,为了提升查询性能和管理效率,常常采用水平分表和垂直分表两种策略。这两种分表方法是数据库优化的重要手段,旨在解决单一表中数据量过大导致的性能瓶颈。 **水平分表(Horizontal ...

    MySQL分库分表技术

    2. **水平分表(Sharding)**:依据一定的规则(如哈希取模、范围划分等)将一个大表拆分成多个小表,分布到不同数据库或同一数据库的不同表中。这样每个表的数据量减少,查询性能得以提升。 **三、分库分表策略** ...

    MySQL分区分表方案实践手册

    ### MySQL分区分表方案实践手册知识点详述 #### 一、MySQL分区简介 数据库分区是一项重要的物理数据库设计技术,主要用于优化数据库性能并简化数据管理。MySQL的分区主要包括两种形式:水平分区和垂直分区。 - **...

    Node.js 实现的 MySQL 分表分库中间件,用于海量数据的分布式集群储存管理和高并发访问。.zip

    在Node.js中实现这样的中间件,意味着开发人员可以利用Node.js的灵活性和性能优势,来设计一个高效、可配置的分库分表方案。 TribeDB-master 这个压缩包可能包含了一个名为"TribeDB"的开源项目源代码,该项目可能...

    MySQL 分库分表的实现原理及演示案例

    数据库分库分表的几种方式主要包括垂直分库、垂直分表、水平分库和水平分表。垂直分库是按照业务的不同进行数据库的分割,每个数据库只包含部分业务的数据;垂直分表是将一个表按照字段划分成多个表,通常按照数据的...

    mysql高可用分库分表.pdf

    为了提升MySQL数据库的性能和可用性,常采用的策略是数据库分库分表,其中可以分为垂直分库、垂直分表、水平分库、水平分表等方法。 垂直分表是针对数据库表中的列进行拆分,将一张大表拆成若干个结构更小的表,以...

    Python+MySQL分表分库实战

    综上所述,"Python+MySQL分表分库实战"的学习内容涵盖了数据库设计原则、Python数据库操作技巧、分库分表策略以及性能优化等多个方面。通过学习和实践,开发者可以有效地解决大数据场景下的存储和查询问题,提高系统...

    php mysql分库分表实例

    总的来说,"php mysql分库分表实例"是一个涵盖数据库设计、性能优化、代码组织等多个方面的实践课题。通过合理地分库分表,可以有效地提升系统处理能力,同时需要充分理解并处理随之带来的挑战,如数据一致性、查询...

    MySQL 分库分表的实现原理及演示案例.zip

    分库分表是数据库水平扩展的一种常见策略,它通过将数据分散到多个数据库或表中,来减轻单个数据库的压力,提高系统的并发处理能力和整体性能。 **分库** 是将一个大数据库拆分成多个小数据库,每个数据库负责一...

    java mysql 分库分表详解

    水平分表是根据行数据来划分,而垂直分表则是根据列数据来拆分。 在Java中实现分库分表,通常需要借助中间件或库,例如ShardingSphere、MyCat等。这些工具提供了完善的分片策略,支持动态数据源路由,可以透明地...

    MySQL中如何进行分库分表的设计和实现?

    MySQL 分库分表设计和实现 MySQL 中的分库分表是一种常用的数据库扩展方式,可以提高数据库的并发处理能力和扩展性。分库分表的设计和实现需要遵循一定的步骤和原则,以下是分库分表的设计和实现的一般步骤: ...

    去年底写的mysql分库分表中间件heisenberg

    Heisenberg是一款开源的MySQL分库分表中间件,它能够帮助开发者实现数据库的水平扩展,提升系统的处理能力和可用性。 **一、Heisenberg简介** Heisenberg取名自量子力学中的海森堡不确定性原理,寓意其在数据库分...

    MySQL数据库设计、优化

    ### MySQL数据库设计与优化知识点详解 #### 一、MySQL数据库设计概述 MySQL作为一种广泛使用的开源关系型数据库管理系统,其设计的好坏直接影响着系统的性能、稳定性和可维护性。因此,合理的数据库设计对于确保...

    应对sharding-jdbc结合mybatis实现分库分表功能 分表的联合查询采用将mysql的数据同步到elasticsearch进行筛选

    主要特性包括水平分库、水平分表、读写分离和分布式事务等。 2. **分库分表**:这是数据库垂直拆分的一种策略,通过将一个大表分散到多个数据库或表中,以减轻单个数据库的压力。Sharding-JDBC允许根据自定义的分片...

    mysql分表分库-mysqlfenbaiofenku.zip

    2. **水平分表**:根据数据的某个属性(如用户ID、订单号等)进行切分,将数据均匀地分布到多个表中。这种方法通常用于数据量非常大的情况,如用户表可以按照用户ID的模运算结果分配到不同的表。 **二、分库...

    Mysql分表分库-core-dbshard2.zip

    1. **分表**:分表是指在一个数据库中将一个大表拆分为多个小表,常见的方法有垂直分表和水平分表。 - **垂直分表**:根据列的业务相关性进行划分,将不常访问或者计算复杂度高的列分离出来,减少主表的大小,优化...

    19道MySQL分库分表高频题整理(附答案背诵版).md

    1. **全面覆盖**:题集涵盖了MySQL分库分表技术中的核心知识点,包括基本概念、设计原则、实现方法、常见问题及解决方案等。 2. **详尽答案**:每道题目提供详细的答案和解释,帮助学习者理解分库分表的实际应用及...

    mysql分表,分区的区别与联系归类.pdf

    分表的常见方法包括垂直分表(按列拆分)和水平分表(按行拆分)。例如,使用Merge存储引擎,可以创建一个总表(如`alluser`),它并不存储实际数据,而是引用多个独立的分表(如`user1`和`user2`)。查询时,通过总...

Global site tag (gtag.js) - Google Analytics