数据库水平分表和垂直分表实际操作

在网上找了很多mysql分表的做法,都大同小异,天下文章一大抄,哈哈,今天我也来抄一抄,不过我是经过实战操作的。

参考的是这里 https://www.cnblogs.com/lucky-man/p/6207873.html。我的做法是:

水平分表
1,假设现在是存储用户聊天记录(哈哈,还是抄的上面链接同志的) 预先建了3个表 然后根据用户uid取模来判定将聊天记录存放在哪个表中:

   

CREATE TABLE `msg_0` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL,
  `content` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
CREATE TABLE `msg_1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL,
  `content` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

CREATE TABLE `msg_2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL,
  `content` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
2,php 代码 

<?php
header("Content-type=text/html;charset=utf8");
$link = mysql_connect("localhost",'root','111111');
if (!$link){
    die("数据库连接失败");
}
mysql_select_db("test");
//水平分表
$uid = mt_rand(1,100);//模拟用户uid
$yu = $uid%3; //分了3个表 所以是%3来取模
 
$table = "msg_".$yu; //判断是哪个表
$content = "hello word_".$table;
 
//插入数据
$sql="insert into ".$table."(uid,content) values(".$uid.",'".$content."')";
$re = mysql_query($sql);
 
 
//查询数据
$s = "select * from ".$table;
$re = mysql_query($s);
 while ($row = mysql_fetch_array($re,MYSQL_ASSOC )){
     ps($row);
 }
 
 
function ps($str){
    echo "<pre>";
    print_r($str);
}
 
function pse($str){
    echo "<pre>";
    print_r($str);
    exit;
}
?>
就是上面那么多内容,水平分表真的就这么简单么?额,反正在网上找的差不多讲的都是这个意思。还有一种是利用mysql自身的merge引擎分表,跟我这个 差不多,自己查查吧!


垂直分表
垂直分表就是将一个表中不经常用到的,或者像text这种类型比较大的字段挪到一个表中,其他常用的字段单独一个表,

如:现在有个user表:如下,有很多字段,现在分成两个表,一个user1用了存放用户主要的属性字段,另一个表user2,用了存放各种时间相关的字段


mysql> desc user;
+----------------+---------------------+------+-----+---------+----------------+
| Field          | Type                | Null | Key | Default | Extra          |
+----------------+---------------------+------+-----+---------+----------------+
| id             | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| group_id       | int(10) unsigned    | NO   |     | 0       |                |
| username       | varchar(32)         | NO   | MUL |         |                |
| nickname       | varchar(50)         | NO   | MUL |         |                |
| password       | varchar(32)         | NO   |     |         |                |
| salt           | varchar(30)         | NO   |     |         |                |
| email          | varchar(100)        | NO   | MUL |         |                |
| mobile         | varchar(11)         | NO   | MUL |         |                |
| avatar         | varchar(255)        | NO   |     |         |                |
| birthday       | date                | NO   |     | NULL    |                |
| prevtime       | int(10) unsigned    | NO   |     | 0       |                |
| logintime      | int(10) unsigned    | NO   |     | 0       |                |
| loginip        | varchar(50)         | NO   |     |         |                |
| loginfailure   | tinyint(1) unsigned | NO   |     | 0       |                |
| joinip         | varchar(50)         | NO   |     |         |                |
| jointime       | int(10) unsigned    | NO   |     | 0       |                |
| createtime     | int(10) unsigned    | NO   |     | 0       |                |
| updatetime     | int(10) unsigned    | NO   |     | 0       |                |

  
mysql> desc user1;
+----------------+---------------------+------+-----+---------+----------------+
| Field          | Type                | Null | Key | Default | Extra          |
+----------------+---------------------+------+-----+---------+----------------+
| id             | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| group_id       | int(10) unsigned    | NO   |     | 0       |                |
| username       | varchar(32)         | NO   | MUL |         |                |
| nickname       | varchar(50)         | NO   | MUL |         |                |
| password       | varchar(32)         | NO   |     |         |                |
| salt           | varchar(30)         | NO   |     |         |                |
| email          | varchar(100)        | NO   | MUL |         |                |
| mobile         | varchar(11)         | NO   | MUL |         |                |
| avatar         | varchar(255)        | NO   |     |         |                |
| birthday       | date                | NO   |     | NULL    |                |
 
mysql> desc user2;
+----------------+---------------------+------+-----+---------+----------------+
| Field          | Type                | Null | Key | Default | Extra          |
+----------------+---------------------+------+-----+---------+----------------+
| uid             | int(10) unsigned    | NO  |     |         |
| prevtime       | int(10) unsigned    | NO   |     | 0       |                |
| logintime      | int(10) unsigned    | NO   |     | 0       |                |
| loginip        | varchar(50)         | NO   |     |         |                |
| loginfailure   | tinyint(1) unsigned | NO   |     | 0       |                |
| joinip         | varchar(50)         | NO   |     |         |                |
| jointime       | int(10) unsigned    | NO   |     | 0       |                |
| createtime     | int(10) unsigned    | NO   |     | 0       |                |
| updatetime     | int(10) unsigned    | NO   |     | 0       |                |
  表user2中通过uid来关联user1表

--------------------- 
作者:xxs18326183038 
来源:CSDN 
原文:https://blog.csdn.net/xxs18326183038/article/details/80622687 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值