本文簡述了mysql表分區的作用和特點,又演示了mysql表分區的創建過程,詳細演示了指定不同分區目錄時的處理辦法。由于表分區對crud操作是透明的,對于普通開發同學其實不用過多關注,但是本著學習的態度,在分庫分表等高大上的技術面前,mysql分區技術依然是一個不可或缺的提升數據庫讀寫能力的關鍵技術。
1、mysql分區的簡單介紹
mysql分區就是將表的數據按照特定規則存放在不同的區域,也就是將表的數據文件分割成多個小塊,在查詢數據的時候,只要知道數據數據存儲在哪些區域,然后直接在對應的區域進行查詢,不需要對表數據進行全部的查詢,提高查詢的性能。同時,如果表數據特別大,一個磁盤磁盤放不下時,我們也可以將數據分配到不同的磁盤去,解決存儲瓶頸的問題,利用多個磁盤,也能夠提高磁盤的IO效率,提高數據庫的性能。
1.1、mysql表分區的特點
- 物理存儲與邏輯分割:邏輯上數據的crud用戶感覺不出表分區的存在,物理上數據按照分區鍵被分配到不同的分區里。
- 查詢性能提升:查詢時,mysql能夠確定讀取那些分區的數據,不用全表掃描。
- 數據管理與維護:分區可以獨立備份、恢復,無需對整表操作。
- 擴展性與并行處理:當表的大小超過單個存儲設備的容量時,很容易擴展到多個存儲設備。
1.2、分區的類型
- RANGE:基于列的值范圍將數據分配到不同的分區。比如可以根據日期范圍將數據分配到不同的月份、年份的分區中。
- LIST:基于列的離散值集合來分配數據的。對應的列的數據是一個類似枚舉型的數據。
- HASH:根據用戶指定的列的hash值分配數據。
- KEY:類似于HASH,但支持多列。
大家對先表分區有個認識后,下面咱們就開始實操一下。
2、操練
2.1、創建表分區
create table t_member(member_id int not null,member_name varchar(60),member_phone varchar(20),create_time datetime,update_time datetime
) PARTITION BY RANGE (YEAR(create_time)) (PARTITION P1 VALUES LESS THAN (2024),PARTITION P2 VALUES LESS THAN (2025),PARTITION P3 VALUES LESS THAN MAXVALUE );
不多解釋了,sql語句還是比較容易理解。上面我創建了3個分區,咱們到服務器上看看數據文件,如下圖:
目前是在一個目錄中,如果你的系統有多個硬盤,把數據文件分別放在不同的硬盤上,那肯定會提高讀寫性能。下面咱們模擬一下過程。因為有些坑大家要避免。
2.2、創建表分區,使用不同的數據目錄
我們從一個簡單的創建sql開始。
create table t_member32(member_id int not null,member_name varchar(60),member_phone varchar(20),create_time datetime,update_time datetime
) PARTITION BY RANGE (YEAR(create_time)) (PARTITION P1 VALUES LESS THAN (2024) DATA DIRECTORY = '/home/jackie',PARTITION P2 VALUES LESS THAN (2025) DATA DIRECTORY = '/mydata',PARTITION P3 VALUES LESS THAN MAXVALUE );
其實就是在剛才的sql的基礎上(表名改了),為三個分區分配了三個不同的目錄。p1、p2指定,p3明確指定存放目錄,那就是保存在默認的目錄里。
直接執行肯定會報錯,因為p1、p2目錄mysql不知道,要先讓mysql知道這兩個目錄,也就是說不能隨便指定一個操作系統的目錄。下來咱們處理這個問題。
2.2.1 配置my.cnf
在my.cnf,找到“mysqld”段,加入下面配置(我就按上面sql寫了):
注意:多個目錄“;”號分割。保存后重啟mysql,依然報錯。還沒完,咱們繼續。
2.2.2 將目錄的owner設置成mysql
管理員登錄,設置/home/jackie和/mydata的owner。你的機器上要是還沒有這兩個目錄就先新建一下。
chown mysql:mysql /home/jackie
chown mysql:mysql /mydata
此時還不行,執行剛才的sql語句時,會報存儲引擎錯誤。
2.2.3、配置apparmor
apparmor是linux的一個安全組件,有興趣大家去查查。咱們修改apparmor的配置:
sudo vim /etc/apparmor.d/usr.bin.mysqld
添加如下配置:
保存退出后,重新加載apparmor配置并重啟,命令如下:
sudo systemctl reload apparmor.service
sudo systemctl restart apparmor.service
再次執行上面的創建語句,就能執行成功了。數據文件也按我們的規劃放到了指定的區域。
這是/home/jackie目錄的數據文件。其他的普通sql操作就不演示了,和普通表的操作一模一樣。如果要在分區后繼續新增分區、刪除分區、合并分區大家可以看看mysql的文檔,這里就不啰嗦了。
好了,大家試試,希望能在工作中對你有幫助。
//~~