MySQL分表的详细设计与应用

转帖|其它|编辑:郝浩|2011-02-11 14:46:17.000|阅读 842 次

概述:本文主要介绍MySQL分表的详细设计与应用,希望对大家有帮助。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法。

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

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

Sql代码

1.CREATE TABLE `test`.`article_0` (
2.`id` BIGINT( 20 ) NOT NULL ,
3.`subject` VARCHAR( 200 ) NOT NULL ,
4.`content` TEXT NOT NULL ,
5.PRIMARY KEY ( `id` )
6.) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
7.
8.CREATE TABLE `test`.`article_1` (
9.`id` BIGINT( 20 ) NOT NULL ,
10.`subject` VARCHAR( 200 ) NOT NULL ,
11.`content` TEXT NOT NULL ,
12.PRIMARY KEY ( `id` )
13.) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
14.
15.CREATE TABLE `test`.`article_2` (
16.`id` BIGINT( 20 ) NOT NULL ,
17.`subject` VARCHAR( 200 ) NOT NULL ,
18.`content` TEXT NOT NULL ,
19.PRIMARY KEY ( `id` )
20.) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
21.
22.CREATE TABLE `test`.`article_3` (
23.`id` BIGINT( 20 ) NOT NULL ,
24.`subject` VARCHAR( 200 ) NOT NULL ,
25.`content` TEXT NOT NULL ,
26.PRIMARY KEY ( `id` )
27.) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
28.
29.CREATE TABLE `test`.`article_4` (
30.`id` BIGINT( 20 ) NOT NULL ,
31.`subject` VARCHAR( 200 ) NOT NULL ,
32.`content` TEXT NOT NULL ,
33.PRIMARY KEY ( `id` )
34.) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
35.
36.CREATE TABLE `test`.`article_5` (
37.`id` BIGINT( 20 ) NOT NULL ,
38.`subject` VARCHAR( 200 ) NOT NULL ,
39.`content` TEXT NOT NULL ,
40.PRIMARY KEY ( `id` )
41.) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
42.
43.CREATE TABLE `test`.`article_6` (
44.`id` BIGINT( 20 ) NOT NULL ,
45.`subject` VARCHAR( 200 ) NOT NULL ,
46.`content` TEXT NOT NULL ,
47.PRIMARY KEY ( `id` )
48.) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
49.
50.CREATE TABLE `test`.`article_7` (
51.`id` BIGINT( 20 ) NOT NULL ,
52.`subject` VARCHAR( 200 ) NOT NULL ,
53.`content` TEXT NOT NULL ,
54.PRIMARY KEY ( `id` )
55.) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
56.
57.CREATE TABLE `test`.`article_8` (
58.`id` BIGINT( 20 ) NOT NULL ,
59.`subject` VARCHAR( 200 ) NOT NULL ,
60.`content` TEXT NOT NULL ,
61.PRIMARY KEY ( `id` )
62.) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
63.
64.CREATE TABLE `test`.`article_9` (
65.`id` BIGINT( 20 ) NOT NULL ,
66.`subject` VARCHAR( 200 ) NOT NULL ,
67.`content` TEXT NOT NULL ,
68.PRIMARY KEY ( `id` )
69.) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

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

1.CREATE TABLE `test`.`article` (
2.`id` BIGINT( 20 ) NOT NULL ,
3.`subject` VARCHAR( 200 ) NOT NULL ,
4.`content` TEXT NOT NULL ,
5.PRIMARY KEY ( `id` )
6.) 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操作

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

Java代码

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

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

Java代码

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

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

Java代码

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

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

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

 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP