(最近在學習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 }
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 }
1.1 通過郵箱登錄,通過郵箱對表進行分割

郵箱基本原理都是和Id差不多,就是要通過一個算法把md5字符串轉成十進制的數,然后再取模,以下為把十六進制的md5字符串轉成十進制的函數。






