標籤:
(最近在學習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 //擷取剛剛插入的Id23 $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分表技術(學習心得)