首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 分區實戰:Hash 分區創建、管理與性能對比

     編輯:MySQL 綜合教學

MySQL 分區實戰:Hash 分區創建、管理與性能對比

分區將大表物理拆分為多個較小片段,對應用透明。本文以 Hash 分區為例,演示創建、管理(增減分區)、與非分區表查詢性能對比。

一、Hash 分區創建

CREATE TABLE t_hash (
  id INT UNSIGNED,
  name CHAR(1)
) ENGINE=MyISAM CHARSET=utf8
PARTITION BY HASH(id)
PARTITIONS 5;

物理文件:t_hash#P#p0.MYD ~ p4.MYD(5 個分區文件)
分區文件

二、數據分布驗證

INSERT INTO t_hash VALUES (1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e'),(6,'f'),(7,'g'),(8,'h'),(9,'i'),(10,'j');

Hash 分區特性:數據均勻分布,各分區文件大小近似。
插入數據 文件大小

三、分區管理

1. 減少分區 (COALESCE PARTITION)

ALTER TABLE t_hash COALESCE PARTITION 3;  -- 5 → 2

數據自動重分佈到剩餘分區。
減少分區

2. 最小分區數 = 1

ALTER TABLE t_hash COALESCE PARTITION 1;  -- 2 → 1

不可再減,至少保留 1 個分區。
最小分區

四、分區表 vs 非分區表查詢對比

測試表

-- 非分區
CREATE TABLE t2 (id INT UNSIGNED, name CHAR(1)) ENGINE=MyISAM CHARSET=utf8;
-- 分區
CREATE TABLE t1 (id INT UNSIGNED, name CHAR(1)) ENGINE=MyISAM CHARSET=utf8 PARTITION BY HASH(id) PARTITIONS 4;

插入相同數據量

插入對比

無索引全表掃描查詢

SELECT * FROM t1 WHERE name='a';
SELECT * FROM t2 WHERE name='a';

結果:分區表耗時 小於 非分區表(分區裁剪生效,僅掃描相關分區)。
查詢耗時

五、四大分區類型選型指南

類型適用場景優點缺點優先級
RANGE時間序列、遞增 ID、明顯區間支援分區裁剪、易歸檔歷史分區分區數固定、熱點分區寫入壓力大★★★★★
LIST枚舉值(地區、狀態、類別)精確映射、支援分區裁剪值不在列表數據丟失、分區數固定★★★★☆
HASH均勻分布、無明顯業務鍵數據均勻、擴容縮容平滑線性 Hash 分布不均、無業務語義★★★☆☆
KEY非整數列(字符串、日期)支援任意列、MySQL 內置 Hash 函數函數複雜 (MD5/SHA)、性能略低★★★☆☆

六、最佳實踐

  • 分區鍵 = 高頻查詢條件列(實現分區裁剪)
  • 分區數 = 2 的冪次(Hash/Key)或業務自然區間(Range/List)
  • 避免「全表掃描」類查詢落在分區表上(退化為多線程全掃)
  • 定期 ANALYZE TABLE 更新分區統計信息
  • 大表歸檔:ALTER TABLE ... DROP PARTITION 秒級清理歷史數據

分區是「物理拆分、邏輯透明」的大表治理利器,選對分區類型與鍵,查詢性能可獲數量級提升。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved