mysql的partition分割槽
前言:當一個表裡面儲存的資料特別多的時候,比如單個.myd資料都已經達到10G了的話,必然導致讀取的效率很低,這個時候我們可以採用把資料分到幾張表裡面來解決問題。
方式一:通過業務邏輯根據資料的大小通過id%10這種來分成 user1,user2,user3等這樣的,但是這樣會有很多問題我們需要維護這樣一個hash關係,
而且每次讀取資料和寫入資料的時候還要去判斷取哪張表,這個是我們通過程式去識別寫表和讀表的。
方式二:mysql可以通過partition進行分割槽,這種分割槽顯示給我們的資料依然都是在一個數據表裡面的,不影響我們讀取查詢資料,
而是mysql內部的檔案機制實現了將資料儲存在不同的資料檔案裡,這樣的好處是mysql自動將對應的資料分到的不同的.myd檔案裡面去了大大降低了檔案的大小,將資料分攤了,很好的提高了效率。
今天分析的是方式二利用mysql的partition進行分割槽
該列子資料庫名:test
mysql安裝路徑:/data/local/mysql/
mysql的partition分割槽又分為兩種:按照範圍分割槽(range),按照雜湊分割槽(list)
一:按照範圍實現分割槽
mysql> create table topic(
-> tid int(4) primary key auto_increment,
-> title char(20) not null default '')
-> engine=myisam default charset=utf8
-> partition by range(tid)(
-> partition test0 values less than(10),
-> partition test1 values less than(20),
-> partition test2 values less than(maxvalue));
Query OK, 0 rows affected (0.05 sec)
進入test資料庫的檔案目錄檢視生成的檔案
ls -all /data/local/mysql/data/test/
特別需要注意檔案型別為.MYD的這裡儲存的是資料
-rw-rw---- 1 mysql mysql 8590 May 10 01:27 topic.frm
-rw-rw---- 1 mysql mysql 40 May 10 01:27 topic.par
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test0.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test0.MYI
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test1.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test1.MYI
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test2.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test2.MYI
我們加入一些資料看看效果
mysql> insert into topic(`title`) values('a');
Query OK, 1 row affected (0.00 sec)
-rw-rw---- 1 mysql mysql 8660 May 6 23:52 t.frm
-rw-rw---- 1 mysql mysql 192 May 6 23:52 t.MYD
-rw-rw---- 1 mysql mysql 2048 May 6 23:52 t.MYI
-rw-rw---- 1 mysql mysql 8590 May 10 01:27 topic.frm
-rw-rw---- 1 mysql mysql 40 May 10 01:27 topic.par
-rw-rw---- 1 mysql mysql 65 May 10 20:16 topic#P#test0.MYD
-rw-rw---- 1 mysql mysql 2048 May 10 20:16 topic#P#test0.MYI
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test1.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test1.MYI
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test2.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test2.MYI
發現 topic#P#test0.MYD檔案大小增加了說明資料寫入到了 topic#P#test0.MYD也就是寫入到了分割槽我們之前建立的test0分割槽裡面去了
我們現在再插入一條資料看下情況
mysql> insert into topic(`tid`,`title`) values(11,'h');
Query OK, 1 row affected (0.00 sec)
-rw-rw---- 1 mysql mysql 8590 May 10 01:27 topic.frm
-rw-rw---- 1 mysql mysql 40 May 10 01:27 topic.par
-rw-rw---- 1 mysql mysql 65 May 10 20:16 topic#P#test0.MYD
-rw-rw---- 1 mysql mysql 2048 May 10 20:16 topic#P#test0.MYI
-rw-rw---- 1 mysql mysql 65 May 10 20:18 topic#P#test1.MYD
-rw-rw---- 1 mysql mysql 2048 May 10 20:18 topic#P#test1.MYI
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test2.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test2.MYI
插入了一條id為11的資料發現topic#P#test1.MYD的檔案大小增加了說明資料寫入到了分割槽為test1裡面去了
我們查詢下資料表裡的資料看一下
mysql> select * from topic;
+-----+-------+
| tid | title |
+-----+-------+
| 1 | a |
| 11 | h |
+-----+-------+
2 rows in set (0.00 sec)
說明:mysql的partition按照範圍(range)分割槽,是以某個欄位的id(為int型別)的 範圍來寫入到對應範圍的分割槽裡面去的。
二:按照雜湊的點進行分割槽
mysql> create table area(
-> uid int(10),
-> uname char(6),
-> aid int)
-> engine=myisam charset utf8
-> partition by list(aid)(
-> partition hb values in (1),
-> partition hn values in (2),
-> partition gd values in (3),
-> partition gx values in (4));
Query OK, 0 rows affected (0.01 sec)
檢視生成的檔案資訊
ls -all /data/local/mysql/data/test/
-rw-rw---- 1 mysql mysql 8618 May 10 19:52 area.frm
-rw-rw---- 1 mysql mysql 32 May 10 19:52 area.par
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gd.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gd.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gx.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gx.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#hb.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#hb.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#hn.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#hn.MYI
我們插入一條來自湖北的使用者資訊
mysql> insert into `area` (`uname`,`aid`) values('東子',1);
Query OK, 1 row affected (0.00 sec)
我們再來檢視資訊發現area#P#hb.MYD的檔案寫入了資料
-rw-rw---- 1 mysql mysql 8618 May 10 19:52 area.frm
-rw-rw---- 1 mysql mysql 32 May 10 19:52 area.par
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gd.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gd.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gx.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gx.MYI
-rw-rw---- 1 mysql mysql 27 May 10 20:03 area#P#hb.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:03 area#P#hb.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#hn.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#hn.MYI
我們再插入一條湖南人的資訊
mysql> insert into `area` (`uname`,`aid`) values('lxm',2);
Query OK, 1 row affected (0.00 sec)
插入後我們發現area#P#hn.MYD檔案的大小增加了說明寫入了資料
-rw-rw---- 1 mysql mysql 8618 May 10 19:52 area.frm
-rw-rw---- 1 mysql mysql 32 May 10 19:52 area.par
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gd.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gd.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gx.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gx.MYI
-rw-rw---- 1 mysql mysql 27 May 10 20:03 area#P#hb.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:03 area#P#hb.MYI
-rw-rw---- 1 mysql mysql 27 May 10 20:06 area#P#hn.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:06 area#P#hn.MYI
檢視一下表裡面的資料
mysql> select * from area;
+------+--------+------+
| uid | uname | aid |
+------+--------+------+
| NULL | 東子 | 1 |
| NULL | lxm | 2 |
+------+--------+------+
2 rows in set (0.00 sec)
說明:按照雜湊的點進行分割槽,是根據插入資訊的關聯的一個id欄位來自動寫入對應的分割槽資料檔案的,從而實現了表的分割槽。