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字段來自動寫入對應的分區數據文件的,從而實現了表的分區。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM