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

目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解。

首先,我们需要想好到底分多少个表,前提当然是满足应用。

这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共 10个表,其取值也很好做,就是对10进行取模。

另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了。

我一共建立10个表:

mysql横表和纵表 mysql纵向分表_数据库

mysql横表和纵表 mysql纵向分表_mysql横表和纵表_02

mysql横表和纵表 mysql纵向分表_sql_03

最后一个表:a,有几点注意:insert_method=last,如果是insert_method=0,则会报错,执行不成功。

 

注意,合并表也必须和前面的表有相同的结构,类型,长度,包括字段的顺序都必须一致这里。

好了,当需要查询的时候,我们可以只对article这个表进行操作就可以了,也就是说这个表仅仅只能进行select操作,

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

mysql横表和纵表 mysql纵向分表_数据库_04

 

 

接下来,我们查看所以得表:

mysql横表和纵表 mysql纵向分表_数据库_05

 

紧接着,我们进行“增删改查”的具体操作。

a.添加数据

步骤:

a-1,先通过表:cre_id,产生一个id值,然后取模(模10),得到,0,1,2,3,4,5,6,7,8,9任意一值。

a-2,拼装数据表:a_n,其中n=0,1,2,3,4,5,6,7,8,9。

a-3,执行常规的插入操作。insert into a_n(...)values(...);

b.代码:



<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <!-- <input type="text" value="">
    <input type="button" id="insert" οnclick="insert();" value="插入数据" />
    <br/> -->

    <form action="insert.php" method="post" name="form1">
        标题:<input type="text" name="title" value=""  size="30"/><br/>
         内容:<textarea name="content" id="" cols="30" rows="10"></textarea><br/><br/>
        <input type="submit" value="提交" />

    </form>

</body>
<script>
    // function insert(){
    //     // alert("aaaaaaaa");
    //     window.location.href="insert.php";
    // }

</script>
</html>



<?php
header("content-type:text/html;charset=utf-8");
// echo "aaaa";
$con = mysql_connect("localhost","root","root");
$db = mysql_select_db('fenbiao');
mysql_set_charset("utf-8");

// var_dump($con,$db);
// echo "aaa";
$sql_num_id = "select count(id) as num from cre_id";

$sql_insert = mysql_query($sql_num_id);
// var_dump($sql_insert);
$res = mysql_fetch_assoc($sql_insert);
// var_dump($res);
$curr_num = intval($res['num']);
// var_dump($curr_num);
$insert_num = $curr_num + 1;

$cre_insert_id = "insert into cre_id(id)values($insert_num)";
$cre_query_id = mysql_query($cre_insert_id);

$table_id = ($insert_num) % 10;

$curr_table = "a_".$table_id;


$sql_a_num = "select count(id) as sum from {$curr_table}";

// echo $sql_a_num;
// exit;
$sql_a_query = mysql_query($sql_a_num);
$sql_a_res = mysql_fetch_assoc($sql_a_query);

$sql_a_sum = intval($sql_a_res['sum']);

$sql_a_insert_id = $sql_a_sum + 1;

$title = trim($_POST['title']);
$content = trim($_POST['content']);

$sql_a_sql = "insert into {$curr_table}(id,sub,con)values($sql_a_insert_id,'{$title}','{$content}')";
$sql_a_query = mysql_query($sql_a_sql);

if($cre_query_id > 0 && $sql_a_query > 0){
   echo "<script>alert('插入成功!');</script>";
   echo "<script>window.history.back();</script>";
}else{
   echo "<script>alert('插入失败!');</script>";
   echo "<script>window.history.back();</script>";
}




?>



几点注意:

对于表:cre_id,首先要查询该表总共的条数,当前id=总条数 + 1;

对于插入表:首先当前id模10,即(%10),拼接数据表:"a_"+"模10后的取值";

插入数据:首先要查询当前表的总数,当前表id= 当前表的总数 + 1,然后执行插入操作;

 

d.部分截图如下:

mysql横表和纵表 mysql纵向分表_mysql横表和纵表_06

mysql横表和纵表 mysql纵向分表_mysql_07

mysql横表和纵表 mysql纵向分表_php_08

mysql横表和纵表 mysql纵向分表_sql_09

mysql横表和纵表 mysql纵向分表_php_10

 

基本上,执行插入操作就OK了。

e.至于:删除操作,修改操作,,之针对a_0,a_1,a_2,a_3.....a_9等进行操作。

如:delete from a_n where id = m;  n=0,1,1...9  ;  m=当前表id值  

update a_n set sub='mm',con='nn' where id=mn;

 

f.select操作。针对于主表a进行就可以了。