iT邦幫忙

1

MySQL 系列文 - Partition Table(1) - 用途

前言

這次想寫的系列文跟 Partition Table 有關,相信不管是用 MSSQL, MySQL 或是其他的資料庫都有聽過這個概念,不過我不會特別去說明該如何建立,相信網路上已經有很多建立的方式,我這裡會針對實務上遇到的幾個問題,以及如何解決的來做分享,大概會有以下幾個主題

  1. 用途
  2. 在既有的 TABLE 上建立 partition
  3. partition 數量與效能的影響
  4. partition by 日期的方式

用途

很多人第一次接觸到 partition Table 的情況是,隨著日子過去,資料量越來越大,搜尋資料的速度越來越慢,開始想找一些方式把資料分散,此時可能會查到幾點

  • 分表:

    • 實體分表,例如把身分證開頭 A 的放在一張表,身分證開頭 F 的放在另一張表
    • 缺點是每張表的名稱都不一樣,還要依據不同表名稱下SQL語法,對應到正確的分表上。而且如果要撈出所有的人,所有表都要 UNION起來。
  • 分區(partition):

    • 實際上看到的還是同一個表,對於應用層也比較單純,且不需要修改
    • 但是物理上可以拆分在不同的位置
    • 舉個簡單的例子,如下圖1

綠色框框的 tb1 是沒有建 partition 的 TABLE ,可以看到只有一個 ibd 檔案
紅色框框的 tb2 是有建兩個 partition 的 TABLE,可以看到有兩個 ibd 檔案
https://ithelp.ithome.com.tw/upload/images/20200417/20124671efKxnkTDoB.png
圖1

★ 建上面兩個 TABLE 的語法如下

CREATE TABLE `tb1` (
  `trans_id` int NOT NULL AUTO_INCREMENT,
  `lang_id` int NOT NULL,
  `lang` char(5) NOT NULL,
  `trans_text` text,
  PRIMARY KEY (`trans_id`,`lang_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE `tb2` (
  `trans_id` int NOT NULL AUTO_INCREMENT,
  `lang_id` int NOT NULL,
  `lang` char(5) NOT NULL,
  `trans_text` text,
  PRIMARY KEY (`trans_id`,`lang_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8
PARTITION BY LIST (`lang_id`)
(
 PARTITION pt1 VALUES IN (1) ENGINE = InnoDB,
 PARTITION pt2 VALUES IN (2) ENGINE = InnoDB
) ;

小結

這裡的 partition (分區) 就是本次主題想討論的,也希望透過接下來的系列分享,讓大家對於 partition 上有更進一步的認識。

資料庫知識相當廣泛,文中若有不正確的地方,也煩請各位大神不吝指教,謝謝


1 則留言

0
ckp6250
iT邦研究生 4 級 ‧ 2020-04-20 20:14:29

  我之前有試著要使用 partition 分區功能,後來發現,如果有用到 foreign key 的話,切分會失敗,等於有一好沒兩好。

Stock iT邦新手 5 級 ‧ 2020-04-20 21:48:57 檢舉

對阿,每一種技術都有其限制,就看當下的情境選擇適合的方法

我要留言

立即登入留言