mysql分表+查詢

mysql分表+查詢php

垂直分表:mysql

  其實沒啥好講,就是 主鍵+經常使用列 放在原表中,再講 主鍵+一些不經常使用列 放在另外的表中。面試

  這樣一個數據頁就能夠存放更多數據。 可是缺點也明顯,可能會增長join 或 union之類的操做。sql

水平分表:數據庫

  今天面試被問到水平分表,忽然愣住了,分都知道,但分完如何有效查詢就很差說了。session

  原則:具體狀況具體分析。memcached

  常見幾種分法:函數

    一、按時間分code

      典型應用:新聞類、qq狀態、朋友圈動態等關注實時或最近的,能夠用時間劃分,好比當月一張表,上個月一張表。md5

    二、按區間分

      一般每張表都會有個自增id,能夠利用自增id分,好比

      user1表 是1~50

      user2表 是51~100 //insert 操做完成後,判斷id值,超過50w時,建立新表

    三、hash分表

      實質上沒啥意思,對每一條插入的數據進行取模, 對於單挑記錄查詢還ok,若是查詢相鄰幾行數據時,就悲劇了。 感興趣的同窗能夠看下面相關連接第一條。

  分表後查詢:

    一、對於時間水平分表:

      假設朋友圈狀態表,天天都會產生20w條記錄, 建表 table_20150401 存放。而後用cron跑一個腳本,天天晚上凌晨建立新表,好比 table_20150402。在php程序中

     執行插入的函數進行封裝,使用下面這兩個函數。  複製代碼

insertData($data){ $table = "table_".date("Ymd",time()); //生成當天表名 insert($data,$table); // 插入新的表中 }

GetData($condition){
//若是條件裏面帶了時間查找,好比:$condition[time] , 則分析出對應表名,選擇對應一張或多張表 $table = "table_".date("Ymd",time()); //生成當天表名 Get($condition,$table); // 在新的表中查找 }

複製代碼

    二、對於id區間劃分

      新聞或朋友圈狀態id 1~1000 1001~2000     1、數據庫裏面建表 breakup_table //這個表裏專門記錄,新分表和原表的 記錄數,方便肯定查找哪一個表     好比: news_1 1 //起始key爲1       news_2 1001 //起始key爲1001       news_3 2001

        2、上述 news_1 之類的數據,第一次須要同數據庫拿,以後能夠放到session或memcached裏面

複製代碼

insertUser($data){    $table_num = getCurrentNewNum(); //這個值用memcached去包裹,if($count < 2001)return 3;elseif($count < 1001)return 2;else 1; $table = "table_".$table_num); //生成指定表名 insert($data,$table); // 插入新的表中 }

GetUser($condition){
$table_num = getCurrentNewNum(); $table = "table_".$table_num); //生成指定表名 Get($condition,$table); // 在新的表中查找 }

複製代碼

    三、對於hash分表查詢:

        典型user表 //單獨拉出來說,由於比較特別,第一次查找可能比較花時間,由於必須根據用戶名肯定去找哪一個表         能夠這作:         $md5_val = md5($user_name); //用crc32()應該也能夠,但何嘗試,若是嘗試記得%u,使其不爲負         $first_val = substr($md5_val, 0,1);//而後去取第一個值         $decimal = hexdec($first_val); //十六進制轉十進制         $table_num = $decimal%3 + 1; // 求餘3,使得只有三張表,table_1,table_2,table_3           主要原理,利用user_name惟一性,導出md5惟一性,而後求餘限制分表數量 複製代碼

insertUser($data){

$table = "table_".$table_num); //生成指定表名
insert($data,$table);  // 插入新的表中

}

GetUser($condition){

$table = "table_".$table_num); //生成指定表名
Get($condition,$table);  // 在新的表中查找

}

複製代碼

    hash 分表也可用於id區間分表,即用id值 取模。

水平分表,典型缺點,對於group by或order by之類的查詢是災難。 

相關文章
相關標籤/搜索