Yahoo MySQL Partition Manager 使用教學

當資料表的資料量過大時,可透過 partition 進行切表,藉此提升查詢效率。
也由於是切表,當資料在做 housekeeping 時,也不會造成資料表的 lock

今天要跟大家介紹,使用 mysql 時,如何動態且有效率地去進行 partition 劃分。

創建 partition 有些限制,如:partition 的值,需要是 pk 的一部分。
或是當有 partition 時,創建 unique key 需要包含 partition 的值。

Quick Start

我們介紹的工具是 Yahoo 出的MySQL Partition Manager,我們可以透過簡單資料表 insert 就達到每日定時切分 partition
我們希望可以做到每天執行每日切分,並且多切兩天的日期。

以下是範例,請參考:

  • 首先可先執行以下 SQL 檔案

  • 創建欲使用 partition table

  • 將欲切分的資料表寫入設定

    這邊針對 partition_manager_settings 表,進行說明

    1. column 由於原本 create_time 欄位使用的 type 為 datetime,因此需要加上 TO_DAYS(create_time)
    2. granularity 單位為秒,increment 為每次增加切分的單位時長
    3. buffer 為需要多創建的時間
    1
    2
    3
    INSERT INTO partition_manager_settings (`table`, `column`, granularity, increment, retain, buffer) VALUES ('game_record', 'TO_DAYS(create_time)', 1, 86400, null, 172800);
    INSERT INTO partition_manager_settings (`table`, `column`, granularity, increment, retain, buffer) VALUES ('player_order', 'TO_DAYS(create_time)', 1, 86400, null, 172800);
    INSERT INTO partition_manager_settings (`table`, `column`, granularity, increment, retain, buffer) VALUES ('player_wallet_history', 'TO_DAYS(create_time)', 1, 86400, null, 172800);
  • 執行 SP
    執行 SP 後會先拆分,後續每日會有 event 進行切分工作。

    1
    call partition_manager();

驗證

執行日期為 2023-08-29 切分了 3 個 partition,分別為 169335360016933536001693526400

1
2
3
4
5
6
7
partition by range (to_days(`create_time`)) (
partition p_START values less than (0),
partition p_1693353600 values less than (1693353600),
partition p_1693440000 values less than (1693440000),
partition p_1693526400 values less than (1693526400),
partition p_END values less than (MAXVALUE)
);

1693353600 換算時間為 2023-08-30 00:00:00
create_time2023-08-29 的資料時,皆會在此 partition 內。

這次的介紹就到這邊,如果有其他問題請再跟我說。

Reference

Yahoo MySQL Partition Manager

謝謝您的支持與鼓勵

Ads