mysql分表技术(学习心得)

Posted 蜗牛噢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql分表技术(学习心得)相关的知识,希望对你有一定的参考价值。

(最近在学习mysql优化的一些问题,以下为个人一些收获,如有不足,敬请提出!)

 

概述:当一个表的数据很大,比如200G,这时太大,我们只靠索引也不好使了,这时我们需要分表和分区处理。分表有两种形式(水平分表和垂直分表)。

一、水平分表

  核心思想:把一个大表,分割N个小表,小表和大表结构一样,只是把数据分散到不同的表中。

 

  1.1 简单例子:比如说是通过ID直接登录(例如QQ号),可以直接使用下面的例子

    

    每次登录验证的时候只要把传过来的Id除3取模,根据模可以找到对应的表,然后再去对应的表做查询操作,以下为php的相关操作,注册以及登录。

    register.php

      

 1 <?php
 2     //接收参数
 3     //测试的参数有:Pwd,Name, Email
 4     extract($_POST);
 5 
 6     //检查是否为空
 7     if(empty($Pwd) || empty($Name) || empty($Email)){
 8         die(\'参数不能为空!\');
 9     }
10 
11     //连接数据库
12     $link = mysql_connect(\'127.0.0.1:3306\',\'root\', \'root\');
13     if(!$link){
14         die(\'数据库连接失败!\');
15     }
16 
17     //选择数据库:这个数据库有:uuid表(产生Id的表)、User0表(存放模为0的用户信息)、User1表(存放模为1的用户信息)和User2表(存放模为2的用户信息)
18     mysql_select_db(\'test\');
19 
20     $sql = \'INSERT INTO uuid VALUES(null)\';
21     if(mysql_query($sql, $link)){
22         //获取刚刚插入的Id
23         $id = mysql_insert_id();
24 
25         //根据 Id%3 来确定该新用户存放的表
26         $table_name = \'User\'.$Id%3;
27 
28         $pwd = md5($Pwd);
29         $sql = "INSERT INTO $table_name VALUES($id, $Name, $pwd, $Email )";
30 
31         if(mysql_query($sql, $link)){
32             echo \'注册成功!\';
33         }else{
34             echo \'注册失败!\';
35         }
36     }
register.php

 

    login.php

      

 1 <?php
 2     header("Content-Type:text/html;charset:utf-8");
 3     
 4     //接收参数:Id, Pwd
 5     extract($_POST);
 6 
 7     //判断是否为空
 8     if(empty($Id) || empty($Pwd)){
 9         die(\'参数不能为空!\');
10     }
11 
12     //连接数据库
13     $link = mysql_connect(\'127.0.0.1:3306\', \'root\', \'root\');
14     if(!$link){
15         die(\'连接失败!\');
16     }
17 
18     //选择数据库
19     mysql_select_db(\'test\');
20 
21     $table_name = \'User\'.$Id%3;
22     $sql = "SELECT * FROM $table_name WHERE Id = $Id";
23     $rst = mysql_query($sql, $link);
24 
25     if($row = mysql_fetch_assoc($rst)){
26         $db_pwd = $row[\'Pwd\'];
27         
28         if($db_pwd == md5($Pwd)){
29             echo \'登录成功!\';
30         }else{
31             echo \'用户名或者密码错误!\';
32         }
33     }else{
34         echo \'Id错误!\';
35     }
login.php

 

 

  1.1 通过邮箱登录,通过邮箱对表进行分割

    

    邮箱基本原理都是和Id差不多,就是要通过一个算法把md5字符串转成十进制的数,然后再取模,以下为把十六进制的md5字符串转成十进制的函数。

    

    

    

 

以上是关于mysql分表技术(学习心得)的主要内容,如果未能解决你的问题,请参考以下文章

mysql15--垂直分表水平分表

浅谈mysql数据库分库分表那些事-亿级数据存储方案

mysql水平分表的几种方法

[精选]彻底搞清分库分表(垂直分库,垂直分表,水平分库,水平分表)

mysql水平分表和分区有啥区别

MySQL:互联网公司常用分库分表方案汇总