mysql分表的详细设计与应用

PRIMARY KEY ( `id` )

CREATE TABLE `test`.`article_4` (
`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

)

PRIMARY KEY ( `id` )

CREATE TABLE `test`.`article_0` (
`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

partition p2009 values less than (2010)

 

CREATE TABLE `test`.`article_7` (
`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

begin

     $this->db->query($sql); 

诚如的话,当大家的数据库的数码超越了100w记录的时候就应有考虑分表也许分区了,这一次本人来详细说说分表的一对情势。方今小编所了然的办法都是MYISAM的,INNODB怎么办分表并且保留事务和外键,小编还不是很通晓。

DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

PRIMARY KEY ( `id` )

也等于说,当我们需求插入数据的时候,必须由那个表来发生id值,作者的php代码的方法如下
 

**为何要分表和分区?
**

好了11个表成立完成了,供给留神的是,这里的id无法设为自增,而且具备的表结构必须一致,包含协会,类型,长度,字段的逐条都必须一律那么对于那个id怎样赢得呢?前边我会详细表明。今后,大家要求二个合併表,用于查询,成立合併表的代码如下:

create table t_key(

) ENGINE = MYISAM

那正是说对于插入也等于insert操作应该如何来搞呢,首先正是收获唯一的id了,这里就还须要三个表来特地创造id,代码如下:

= 开端敲定 =

`subject` VARCHAR( 200 ) NOT NULL ,

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

`name`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL
DEFAULT NULL ,

`subject` VARCHAR( 200 ) NOT NULL ,

转自 

AUTO_INCREMENT=2

`content` TEXT NOT NULL ,

CREATE TABLE `test`.`article_2` (
`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

分区和分表相似,都是根据规则分宁心。分裂在于分表将大表分解为多少个独立的实业表,而分区是将数据分段划分在五个岗位存放,可以是同等块磁盘也得以在差别的机械。分区后,表面上可能一张表,但数量散列到八个地方了。app读写的时候操作的恐怕大表名字,db自动去协会分区的数额。

 

 这里INSERT_METHOD=0在好几版本或然不办事,供给改成INSERT_METHOD=NO
专注,合併表也必须和前边的表有一样的布局,类型,长度,包含字段的依次都必须一律这里的INSERT_METHOD=0表示不容许对本表进行insert操作。好了,当须求查询的时候,我们能够只对article那几个表展开操作就足以了,也等于说这些表仅仅只好进行select操作

UNION=(`account_2011`,`account_2012`)

) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

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

`money`  float NOT NULL ,

) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

第一,我们供给想好到底分多少个表,前提当然是满意使用。这里本身使用了二个相比简单的分表方法,就是依靠自增id的尾数来分,也正是说分0-9一共十三个表,其取值也很好做,便是对10进展取模。别的,还是能依照某一字段的md5值取中间二人张开分表,那样的话,能够分的表就广大了。

`tradeDate`  datetime NOT NULL

     return ‘article_’.intval($id)%10; 

CREATE TABLE `test`.`article_1` (
`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

mysql分表和分区有哪些关联吗?

`content` TEXT NOT NULL ,

 

partition p2007 values less than (2008),

) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

 

List:

`id` BIGINT( 20 ) NOT NULL ,

 

分表是将八个大表依照一定的规则分解成多张保有独立存款和储蓄空间的实体表,大家能够称之为子表,每一个表都对应三个公文,MYD数据文件,.MYI索引文件,.frm表结构文件。读写的时候依照路由定义获得相应的子表名,然后去操作它。

 

好了,现在只要大家要插入一条数据了,应该怎么操作呢?依然再而三看代码吧

4.表分区绝对于分表,操作便利,无需创设子表。

`id` BIGINT( 20 ) NOT NULL ,

对于update的操作应该无需加以了呢,无非是有了id,然后拿走表名,然后进行update操作就好了

create table range(

`id` BIGINT( 20 ) NOT NULL ,

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);
}

partition by key (b)

`subject` VARCHAR( 200 ) NOT NULL ,

 

;

) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

CREATE TABLE `test`.`article_6` (
`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

`id`  int(11) NOT NULL AUTO_INCREMENT ,

`content` TEXT NOT NULL ,

好了,先来创建表吧,代码如下

`tradeDate`  datetime NOT NULL

`id` BIGINT( 20 ) NOT NULL ,

function get_Table_Name($id) {
    return ‘article_’.intval($id)%10;//这里取模运算起到了不能缺少的作用
}

money int(11) unsigned not null,

 

其实很简单的,正是先获得id,然后依据id获取相应插入到哪个表,然后就异常粗略了。

新扩展分区

     $id   = $this->get_AI_ID(); 

CREATE TABLE `test`.`article_5` (
`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

去除分区

CREATE TABLE `test`.`article_9` ( 

CREATE TABLE `test`.`article_3` (
`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

* 要是查询语句中有未创制索引字段,分区时间远远优于未分区时间

 

CREATE TABLE `account_all` (

CREATE TABLE `test`.`article_6` ( 

 

while v < 8000000

`id` BIGINT( 20 ) NOT NULL ,

CREATE TABLE `test`.`article_8` (
`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

create table list(

 

 

DEFAULT CHARACTEWrangler SET=utf8      //暗中同意字符集utf-8           

 

= 最终定论 =

对此update的操作自个儿想应该不供给加以了呢,无非是有了id,然后拿走表名,然后实行update操作就好了。

    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`);

下面的SQL,将p201001 – p201009 合并为3个分区p2010Q1 – p2010Q3

CREATE TABLE `test`.`create_id` ( 

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

end

PRIMARY KEY ( `id` )

 

p201004,p201005,p201006,

`id` BIGINT( 20 ) NOT NULL ,

分区的统一

 

`money`  float NOT NULL ,

 

DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

`content` TEXT NOT NULL ,

主表,所有年

一般的话,当大家的数据库的数量超过了100w记录的时候就应该考虑分表只怕分区了,本次自个儿来详细说说分表的一…

INSERT_METHOD=LAST

`subject` VARCHAR( 200 ) NOT NULL ,

子表2011年

`subject` VARCHAR( 200 ) NOT NULL ,

怎么是分表?

 

`id`  int(11) NOT NULL AUTO_INCREMENT ,

CREATE TABLE `test`.`article_3` ( 

CREATE TABLE `account_2011` (

* 用于根据id获取表名 

)