日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql的partition分区

發布時間:2024/8/26 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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字段來自動寫入對應的分區數據文件的,從而實現了表的分區。

?

轉載于:https://www.cnblogs.com/lisqiong/p/5647907.html

總結

以上是生活随笔為你收集整理的mysql的partition分区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。