1. 程式人生 > >mysql的partition分割槽

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欄位來自動寫入對應的分割槽資料檔案的,從而實現了表的分割槽。