## 分區表的原理
>[info] 對用戶而言,分區表是一個獨立的邏輯表,但是底層MySql將其分成了多個物理子表,這對用戶來說是透明的,每一個分區表都會使用一個獨立的表文件。
>[info] 創建表時使用 `partition by` 子句定義每個分區存放的數據,執行查詢時,優化器會根據分區定義過濾那些沒有我們需要數據的分區,這樣查詢只需要查詢所需數據在的分區即可。
>[info] 分區的主要目的是將數據按照一個較粗的粒度分在不同的表中,這樣可以將相關的數據存放在一起,而且如果想一次性刪除整個分區的數據也很方便。
**適用場景**
* 表非常大,無法全部存在內存,或者只在表的最后有熱點數據,其他都是歷史數據。
* 分區表的數據更易維護,可以對獨立的分區進行獨立的操作。
* 分區表的數據可以分布在不同的機器上,從而高效使用資源
* 可以使用分區表來避免某些特殊的瓶頸
* 可以備份和恢復獨立的分區
>[warning]
> * 一個表最多只能有1024個分區
> * `5.1`版本中,分區表達式必須是整數,`5.5`可以使用列分區
> * 分區字段中如果有主鍵和唯一索引列,那么主鍵列和唯一列都必須包含進來
> * 分區表中無法使用外鍵索引(約束)
> * 需要對現有表的結構進行修改
> * 所有分區都必須使用相同的存儲引擎
> * 分區函數中可以使用的函數和表達式會有一些限制
> * 某些存儲引擎不支持分區
> * 對于MyISAM的分區表,不能使用load index into cache
> * 對于MyISAM表,使用分區表時需打開更多的文件描述符
## 分庫分表的原理
>[info]通過一些`hash`算法或者工具實現將一張數據表垂直或者水平進行物理切分
**適用場景**
* 單表記錄條數達到百萬到千萬級別時
* 解決表鎖的問題
**分表方式**
>* 水平分割:分割后可以降低在查詢時需要讀的數據和索引的頁數,同時也降低了索引的層數,提高查詢數獨
> * 適用場景
> * 表的數據本身就有獨立性,例如分別記錄各個地區的數據,或不同時期的數據
> * 需要把數據存放在多個介質上
> * 缺點
> * 給應用增加復雜度,通常查詢時需要多個表名,查詢所有數據需`union`操作
> * 在許多數據庫應用中,復雜會超過它帶來的優點,查詢時會增加一個索引層的磁盤次數
> ****
> * 垂直分割:可以使數據行變小,一個數據頁能存儲更多數據,查詢時減少I/O次數
> * 適用場景
> * 一個表某些列常用,而另外一些列不常用
> * 缺點
> * 管理冗余列,查詢所有數據需要`join`操作
**分表缺點**
```
有些分表的策略基于應用層的邏輯算法,一旦邏輯算法改變,整個分表邏輯都會改變,擴展性較差
對于應用層來說,邏輯算法無疑增加開發成本
```
- 簡介
- PHP
- 字符串函數
- 數組函數
- 正則
- 加密函數
- 面向對象
- 關鍵字
- 設計模式
- 魔術方法
- 機制擴展
- 會話機制
- PHP框架
- laravel
- 問題
- swoole
- easyswoole
- workerman
- 數據庫
- Sphinx
- MongoDB
- MemCache
- Redis
- 基礎操作
- 數據類型
- 持久化
- 分布式鎖
- 內存模型
- redis高級特性
- MySql
- 基礎操作
- 數據類型
- 數據表引擎
- 鎖機制
- 事務處理
- 存儲過程
- 觸發器
- 索引
- 關聯查詢
- 分析SQL語句-優化查詢
- 分區分表
- 主從復制
- MySql安全性
- 網絡協議
- HTTP
- header詳解
- 狀態碼
- nginx-配置
- 邏輯算法
- 時間和空間復雜度
- 常見算法
- 數據結構
- 核心
- 進程、線程、協程
- 存儲容量-計量單位
- 開發軟件及配置
- 版本控制器
- Git
- Fidder
- Fidder-Android7
- 自動化部署
- Jenkins
- supervisor
- Elasticsearch
- LogStash
- RabbitMQ
- AB測試
- JAVA-JDK
- FileBeat
- PhpStorm
- Composer
- Linux
- API安全
- 高并發及大流量相關概念
- 網站優化
- WEB
- Electron