mysql —— 分表分割槽(1)
RANGE分割槽:基於一個給定連續區間的列值,把多行分配給分割槽。
LIST分割槽:類似於按RANGE分割槽,區別在於LIST分割槽是基於列值匹配一個離散值集合中的某個值來進行選擇。
HASH分割槽:基於使用者定義的表示式的返回值來進行選擇的分割槽,該表示式使用將要插入到表中的這些行的列值進行計算。這個函式可以包含MySQL 中有效的、產生非負整數值的任何表示式。
KEY分割槽:類似於按HASH分割槽,區別在於KEY分割槽只支援計算一列或多列,且MySQL 伺服器提供其自身的雜湊函式。必須有一列或多列包含整數值。 ----很少用到
-> partition by range(year(c3))(
-> partition p0 values less than (1995),
-> partition p1 values less than (1996),
-> partition p2 values less than (1997),
-> partition p3 values less than (1998),
-> partition p4 values less than (1999),
-> partition p5 values less than (2000),
-> partition p6 values less than (2001),
-> partition p7 values less than (2002),
-> partition p8 values less than (2003),
-> partition p9 values less than (2004),
-> partition p10 values less than (2010),
-> partition p11 values less than MAXVALUE);
Query OK, 0 rows affected (0.14 sec)
建立非分割槽表
mysql> create table no_part_tab ( c1 int default NULL, c2 varchar(30) default null, c3 date default null) engine=myisam;
Query OK, 0 rows affected (0.11 sec)
mysql> \d // #由於下面要用到儲存過程,這裡需要修改結束符為“//”。所謂的儲存過程其實也就是眾多sql語句的集合。
mysql> create procedure load_part_tab()
-> begin
-> declare v int default 0;
-> while v < 8000000
-> do
-> insert into part_tab
-> values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520)mod 3652));
-> set v = v+1;
-> end while;
-> end
-> //
Query OK, 0 rows affected (0.04 sec)
mysql> \d ; // 執行完這個儲存過程後,需要將結束符修改回去
上面的儲存過程實際上是為了建立大量的資料(800萬條)
mysql> call load_part_tab(); // 呼叫load_part_tab這個儲存過程
Query OK, 1 row affected (9 min 18.95 sec)
快速將part_tab裡面的資料插入到no_part_tab裡面
mysql> insert no_part_tab select * from part_tab;
Query OK, 8000000 rows affected (8.97 sec)
Records: 8000000 Duplicates: 0 Warnings: 0
測試一:
實驗之前確保兩個表裡面的資料是一致的!保證實驗的可比性
mysql> select count(*) from part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';
+----------+
| count(*) |
+----------+
| 795181 |
+----------+
1 row in set (0.49 sec)
mysql> select count(*) from no_part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';
+----------+
| count(*) |
+----------+
| 795181 |
+----------+
1 row in set (3.94 sec)
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: part_tab
type: ALL //全表掃描
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 798458
Extra: Using where
1 row in set (0.09 sec)
ERROR:
No query specified
mysql> desc select count(*) from no_part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: no_part_tab
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 8000000
Extra: Using where
1 row in set (0.00 sec)
ERROR:
No query specified
結論:可以看到,做了分割槽之後,只需要掃描79萬條語句,而不做分割槽的,則需要進行全表掃描,故可以看出,做了分割槽技術後,可以提高讀寫效率。
測試2:
建立索引,檢視語句執行情況
mysql> create index idx_c3 on no_part_tab(c3);
Query OK, 8000000 rows affected (32.68 sec)
Records: 8000000 Duplicates: 0 Warnings: 0
結果分析:
mysql> desc select count(*) from no_part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: NO_part_tab
type: range
possible_keys: idx_c3
key: idx_c3
key_len: 4
ref: NULL
rows: 785678
Extra: Using where; Using index
1 row in set (0.16 sec)
ERROR:
No query specified
結論:為未分割槽的表建立了索引之後,再次執行相同的語句,可以看到該SQL語句是根據range索引進行檢索,而不是全表掃描了。明顯效率也提高了。
測試3:
測試做索引與未作索引的讀寫效率。
mysql> create index idx_c3 on part_tab(c3);
Query OK, 8000000 rows affected (31.85 sec)
Records: 8000000 Duplicates: 0 Warnings: 0
mysql> desc select count(*) from part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: part_tab
type: index
possible_keys: idx_c3
key: idx_c3
key_len: 4
ref: NULL
rows: 798458
Extra: Using where; Using index
1 row in set (0.14 sec)
ERROR:
No query specified
測試未建立索引欄位
mysql> select count(*) from no_part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31' and c2='hello';
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (4.90 sec)
結論:可以看到如果沒通過索引進行檢索所耗費的時間將長於通過索引進行檢索。
測試4:刪除
mysql> delete from part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';
Query OK, 795181 rows affected (14.02 sec)
mysql> delete from no_part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';
Query OK, 795181 rows affected (15.21 sec)
結論:可以看到,在刪除方面,有分割槽的還是比沒分割槽的快一點。從而體現了其便於資料管理的特點
方便資料管理這點,我通過下面的例子來說明:比如資料庫的表t1記錄的是今年一整年(12個月)公司的營業額,在未分割槽的情況下,也就是說資料檔案都存放在同一個檔案裡面,那麼假如現在要刪除第一個季度的記錄,那麼需要全表掃描才能得出結果。但如果t1這個表事先做了分割槽,那麼我只需要分別刪除1,2,3這三個檔案即可。所以從一定程度上,還是方便了管理。
相關文章
- mysql 分表 分割槽MySql
- mysql的分割槽和分表MySql
- mysql的分割槽與分表MySql
- MySql分表、分庫、分片和分割槽MySql
- mysql表水平拆分和分割槽分表MySql
- mysql之分割槽表小結1MySql
- 【MYSQL】 分割槽表MySql
- MySQL 分割槽表MySql
- MySQL分割槽表MySql
- MySQL分表後原分割槽表處理方案MySql
- MySQL 分割槽表探索MySql
- mysql 分割槽表用法MySql
- MySQL表分割槽管理MySql
- MySQL 分割槽表 partition線上修改分割槽欄位MySql
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- 全面學習分割槽表及分割槽索引(1)索引
- 深入學習分割槽表及分割槽索引(1)索引
- mysql 進行表分割槽MySql
- Mysql表分割槽實現MySql
- mysql分割槽表筆記MySql筆記
- MySQL入門--分割槽表MySql
- MySQL的List分割槽表MySql
- Mysql表分割槽實操MySql
- MySQL分割槽表的分割槽原理和優缺點MySql
- 將mysql非分割槽錶轉換為分割槽表MySql
- MySQL 分割槽表知識整理MySql
- MySQL調優之分割槽表MySql
- mysql分割槽表小結2MySql
- OGG Oracle 分割槽壓縮表 到 MySQL分表的實現OracleMySql
- Oracle分割槽表基礎運維-07增加分割槽(1範圍分割槽)Oracle運維
- oracle分割槽表和分割槽表exchangeOracle
- hive 分割槽表和分桶表區別Hive
- MySQL資料表分割槽手記MySql
- (3) MySQL分割槽表使用方法MySql
- Hash分割槽表分割槽數與資料分佈的測試
- 全面學習分割槽表及分割槽索引(13)--分隔表分割槽索引
- oracle分割槽表和非分割槽表exchangeOracle
- mysql~關於mysql分割槽表的測試MySql