## 垂直分表
其實沒啥好講,就是 主鍵+常用列 放在原表中,再講 主鍵+一些不常用列 放在另外的表中。
這樣一個數據頁就可以存放更多數據。 但是缺點也明顯,可能會增加join 或 union之類的操作。
## 水平分表
### 按時間分
典型應用:新聞類、qq狀態、朋友圈動態等關注實時或最近的,可以用時間劃分,比如當月一張表,上個月一張表。
### 按區間分
通常每張表都會有個自增id,可以利用自增id分,比如
user1表 是1~50
user2表 是51~100
//insert 操作完成后,判斷id值,超過50時,創建新表
### hash分表
實質上沒啥意思,對每一條插入的數據進行取模, 對于單挑記錄查詢還ok,如果查詢相鄰幾行數據時,就悲劇了。
## 分表后查詢
### 對于時間水平分表
假設朋友圈狀態表,每天都會產生20w條記錄, 建表 table_20150401 存放。
然后用cron跑一個腳本,每天晚上凌晨創建新表,比如 table_20150402。在php程序中
執行插入的函數進行封裝,使用下面這兩個函數。
```php
// 添加數據
function insertData($data){
$table = "table_".date("Ymd",time()); //生成當天表名
insert($data,$table); // 插入新的表中
}
// 獲取數據
function GetData($condition){
//如果條件里面帶了時間查找,比如:$condition[time] , 則分析出對應表名,選擇對應一張或多張表
$table = "table_".date("Ymd",time()); //生成當天表名
Get($condition,$table); // 在新的表中查找
}
```
### 對于id區間劃分
新聞或朋友圈狀態id 1~1000 1001~2000
一、數據庫里面建表 breakup_table //這個表里專門記錄,新分表和原表的 記錄數,方便確定查找哪個表
比如:
news_1 1 //起始key為1
news_2 1001 //起始key為1001
news_3 2001
二、上述 news_1 之類的數據,第一次需要同數據庫拿,之后可以放到session或memcached里面
```php
function insertUser($data){
//這個值用memcached去包裹,if($count < 2001)return 3;elseif($count < 1001)return 2;else 1;
$table_num = getCurrentNewNum();
$table = "table_".$table_num); //生成指定表名
insert($data,$table); // 插入新的表中
}
function GetUser($condition){
$table_num = getCurrentNewNum();
$table = "table_".$table_num); //生成指定表名
Get($condition,$table); // 在新的表中查找
}
```
### 對于hash分表查詢
典型user表 //單獨拉出來講,因為比較特別,第一次查找可能比較花時間,因為必須根據用戶名確定去找哪個表
可以這做:
```php
$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唯一性,然后求余限制分表數量
```php
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之類的查詢是災難。
- 簡介
- 數據庫
- 數據表
- 創建數據表
- 查看數據表結構
- 修改數據表
- 刪除數據表
- 查詢數據
- 表單查詢
- 聚合查詢
- 鏈接查詢
- 子查詢
- 聯合查詢
- 正則查詢
- 數據管理
- 數據類型
- 添加數據
- 更新數據
- 刪除數據
- 索引
- 索引分類
- 設計原則
- 添加索引
- 查看索引
- 刪除索引
- 視圖
- 視圖操作
- 視圖應用
- 事務
- 觸發器
- 存儲過程和函數
- 變量
- 異常處理
- 光標
- 流程控制
- 存儲過程
- 自定義函數
- 內置函數
- 數學
- 字符串
- 日期和時間
- 條件判斷
- 系統信息
- 加/解密
- 其他
- 用戶管理
- 登錄和退出
- 新建用戶
- 刪除用戶
- 修改用戶
- 找回ROOT密碼
- 權限管理
- 備份恢復
- 備份數據
- 恢復數據
- 日志
- 二進制日志
- 錯誤日志
- 查詢日志
- 慢查詢日志
- 性能優化
- 優化查詢語句
- 優化數據庫結構
- 優化服務器
- 主從復制
- WIN系統主從復制
- Linux單機主從復制
- Linux聯機主從復制
- 參數配置
- 日常管理和維護
- 切換主從服務器
- PHP操作
- 連接
- 創建數據庫
- 插入數據
- 插入多條數據
- 預處理語句
- 查詢數據
- 預處理語句
- 實戰應用
- 分表