mysql分区、分表学习
分區
一、什么是表分區
通俗地講表分區是將一大表,根據條件分割成若干個小表。mysql5.1開始支持數據表分區了。
如:某用戶表的記錄超過了600萬條,那么就可以根據入庫日期將表分區,也可以根據所在地將表分區。當然也可根據其他的條件分區。
使用表分區技術對客戶端沒有影響相當于所有的數據還是存放在一張表中,但是相對于mysql內部來講,卻是將數據拆分存放在不同位置中,就好比一個文件夾下文件過多需要整理存放在不同子文件夾中一樣。
二、為什么要對表進行分區
為了改善大型表以及具有各種訪問模式的表的可伸縮性,可管理性和提高數據庫效率。
分區的一些優點包括:
三、分區類型
四、各分區詳細介紹
1.range分區
CREATE TABLE employees (id INT NOT NULLstore_id int ) partition BY RANGE (store_id) (partition p0 VALUES LESS THAN (6),partition p1 VALUES LESS THAN (11),partition p2 VALUES LESS THAN (16),partition p3 VALUES LESS THAN MAXVALUE );- 這樣p0-p5的店員會保存在p0,p6-p10的店員會保存在p1,以此類推。MAXVALUE為常量表示最大的可能的整數值。
- 這里最值得注意的限制是MySQL 必須能夠計算表達式的返回值作為LESS THAN (<)比較的一部分;因此,表達式的值不能為NULL。
RANGE分區在如下場合特別有用:
2.list分區
假定有20個音像店,分布在4個有經銷權的地區,如下表所示:
| 東區 | 1,2,3,4 |
| 西區 | 11,12 |
| 南區 | 5,6,7 |
| 北區 | 8,9,10 |
要按照屬于同一個地區商店的行保存在同一個分區中的方式來分割表,可以使用下面的“CREATE TABLE”語句:
CREATE TABLE employees (id INT NOT NULLstore_id int ) partition BY LIST(store_id)(partition pNorth VALUES IN (8,9,10),partition pEast VALUES IN (1,2,3,4),partition pWest VALUES IN (5,6,7),partition pSouth VALUES IN (11,12) );這使得在表中增加或刪除指定地區的雇員記錄變得容易起來。例如,假定西區的所有音像店都賣給了其他公司。那么與在西區音像店工作雇員相關的所有記錄(行)可以使用查詢“ALTER TABLE employees DROP PARTITION pWest;”來進行刪除,它與具有同樣作用的DELETE (刪除)查詢“DELETE query DELETE FROM employees WHERE store_id IN (4,12,13,14,18);”比起來,要有效得多。
【要點】:如果試圖插入列值(或分區表達式的返回值)不在分區值列表中的一行時,那么“INSERT”查詢將失敗并報錯。例如,假定LIST分區的采用上面的方案,下面的查詢將失敗:
INSERT INTO employees VALUES(224, 'Linus', 'Torvalds', '2002-05-01', '2004-10-12',?42,?21);這是因為“store_id”列值21不能在用于定義分區pNorth, pEast, pWest,或pCentral的值列表中找到。要重點注意的是,LIST分區沒有類似如“VALUES LESS THAN MAXVALUE”這樣的包含其他值在內的定義。將要匹配的任何值都必須在值列表中找到。
3.hash分區
CREATE TABLE employees (id INT NOT NULLstore_id int ) PARTITION BY HASH(store_id)PARTITIONS 4;hash分區的目的是將數據均勻的分布到預先定義的各個分區中,保證各分區的數據數量大致一致。
4.key分區
CREATE TABLE employees (id INT NOT NULLstore_id int ) PARTITION BY key(store_id)PARTITIONS 4;類似于按HASH分區,區別在于KEY分區只支持計算一列或多列,且MySQL 服務器提供其自身的哈希函數。必須有一列或多列包含整數值。
五、管理分區語法
取余:key,hash
增加分區數量
alter?table?employees?add?partition?partitions?1;減少分區數量
alter?table?employees?coalesce?partition?1;采用取余算法的分區數量的修改,不會導致已有數據的丟失
條件:list,range
增加分區數量
alter table employees add partition (partition pCenter VALUES IN (13,14) )刪除分區
alter?table?employees?drop?partition?pNorth;==注意==:刪除條件算法的分區將會導致已有數據的丟失
六、選擇分區算法
平均分配(key,hash):就按照主鍵進行key即可(非常常見)
按照某種業務邏輯進行分區(range,list):選擇那種整數型做分區字段或者最容易被篩選的字段
分表
1.水平分表:根據一列或多列數據的值把數據行放到兩個獨立的表中。
2.垂直分割:把主碼和一些列放到一個表,然后把主碼和另外的列放到另一個表中。
原來一個表中有a,b,c,d四個字段,垂直就是豎著切一刀,分成a,b一個表,c,d一個表。通過同一個字段關聯起來。
水平么,比如將ID=1的用戶所產生的所有記錄放在Table1,ID=2的放在Table2,兩個Table字段完全一樣。。
主要就是豎著切一刀,或者橫著切一刀的區別。
總結
以上是生活随笔為你收集整理的mysql分区、分表学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OkHttp学习
- 下一篇: mysql索引及优化