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字符串轉成十進制的函數。

    

    

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM