文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  優化資料大小

10.4.1 優化資料大小

設計您的資料表,以盡量減少它們在磁碟上的空間。這可以藉由減少寫入和從磁碟讀取的資料量,來產生巨大的改進。較小的資料表通常需要較少的主記憶體,同時它們的內容在查詢執行期間被主動處理。任何資料表資料的空間縮減也會導致可以更快處理的較小索引。

MySQL 支援許多不同的儲存引擎(資料表類型)和列格式。對於每個資料表,您可以決定要使用的儲存和索引方法。為您的應用程式選擇適當的資料表格式可以為您帶來很大的效能提升。請參閱第 17 章,InnoDB 儲存引擎第 18 章,替代儲存引擎

您可以藉由使用此處列出的技術來獲得更好的資料表效能並最大限度地減少儲存空間

資料表欄位

  • 使用最有效率(最小)的資料類型。MySQL 有許多節省磁碟空間和記憶體的特殊類型。例如,如果可能,請使用較小的整數類型來取得較小的資料表。MEDIUMINT 通常是比 INT 更好的選擇,因為 MEDIUMINT 欄位使用的空間少 25%。

  • 如果可能,請宣告欄位為 NOT NULL。它藉由啟用對索引的更好使用,並消除測試每個值是否為 NULL 的額外負擔,來使 SQL 操作更快。您還可以節省一些儲存空間,每個欄位一位元。如果您真的需要在資料表中使用 NULL 值,請使用它們。只要避免預設設定允許每個欄位中的 NULL 值。

列格式

  • InnoDB 資料表預設會使用 DYNAMIC 列格式建立。若要使用 DYNAMIC 以外的列格式,請組態 innodb_default_row_format,或在 CREATE TABLEALTER TABLE 語句中明確指定 ROW_FORMAT 選項。

    列格式的緊湊系列,包括 COMPACTDYNAMICCOMPRESSED,以增加某些操作的 CPU 使用率為代價,減少列儲存空間。如果您的工作負載是受快取命中率和磁碟速度限制的典型工作負載,則它可能會更快。如果它是受 CPU 速度限制的罕見情況,則可能會較慢。

    當使用可變長度字元集 (例如 utf8mb3utf8mb4) 時,緊湊的列格式系列也能最佳化 CHAR 欄位的儲存。使用 ROW_FORMAT=REDUNDANT 時,CHAR(N) 會佔用 N × 字元集的最大位元組長度。許多語言主要可以使用單位元組的 utf8mb3utf8mb4 字元編寫,因此固定儲存長度通常會浪費空間。使用緊湊的列格式系列時,InnoDB 會為這些欄位分配一個可變量的儲存空間,範圍從 NN × 字元集的最大位元組長度,方法是移除尾隨空格。最小儲存長度為 N 個位元組,以便在典型情況下進行就地更新。如需更多資訊,請參閱 第 17.10 節「InnoDB 列格式」

  • 若要透過以壓縮形式儲存表格資料來進一步減少空間,請在建立 InnoDB 表格時指定 ROW_FORMAT=COMPRESSED,或在現有的 MyISAM 表格上執行 myisampack 命令。(InnoDB 壓縮表格是可讀寫的,而 MyISAM 壓縮表格是唯讀的。)

  • 對於 MyISAM 表格,如果您沒有任何可變長度的欄位 (VARCHARTEXTBLOB 欄位),則會使用固定大小的列格式。這會比較快,但可能會浪費一些空間。請參閱第 18.2.3 節「MyISAM 表格儲存格式」。即使您有 VARCHAR 欄位,您也可以使用 CREATE TABLE 選項 ROW_FORMAT=FIXED 來提示您想要使用固定長度的列。

索引

  • 表格的主索引應盡可能簡短。這使得每個列的識別都容易且有效率。對於 InnoDB 表格,主索引鍵欄位會複製到每個次要索引條目中,因此如果您有很多次要索引,簡短的主索引鍵可以節省大量空間。

  • 僅建立您需要用來改善查詢效能的索引。索引對於擷取很有用,但會減慢插入和更新作業的速度。如果您主要透過搜尋欄位的組合來存取表格,請針對它們建立單個複合索引,而不是為每個欄位建立單獨的索引。索引的第一部分應該是最常使用的欄位。如果您在從表格中選取時總是使用許多欄位,則索引中的第一個欄位應該是具有最多重複值的欄位,以獲得更好的索引壓縮。

  • 如果長字串欄位的前幾個字元很可能具有唯一的前綴,則最好僅索引此前綴,方法是使用 MySQL 對於在欄位最左側部分建立索引的支援 (請參閱 第 15.1.15 節「CREATE INDEX 陳述式」)。較短的索引速度較快,不僅因為它們需要較少的磁碟空間,而且還因為它們可以在索引快取中提供更多命中率,從而減少磁碟搜尋。請參閱 第 7.1.1 節「設定伺服器」

聯結

  • 在某些情況下,將經常掃描的表格分割成兩個可能會很有幫助。如果它是動態格式表格,而且可以使用較小的靜態格式表格來找到掃描表格時的相關列,則尤其如此。

  • 在不同的表格中宣告具有相同資訊的欄位時,請使用相同的資料類型,以加快基於對應欄位的聯結速度。

  • 讓欄位名稱簡單明瞭,以便您可以在不同的表格中使用相同的名稱,並簡化聯結查詢。例如,在名為 customer 的表格中,請使用 name 而不是 customer_name 作為欄位名稱。若要讓您的名稱可移植到其他 SQL 伺服器,請考慮將其長度保持在 18 個字元以下。

正規化

  • 通常,請盡量保持所有資料的非冗餘性 (觀察資料庫理論中所謂的第三正規化形式)。與其重複冗長的值 (例如姓名和地址),不如為它們指派唯一的 ID,在多個較小的表格中根據需要重複這些 ID,並在查詢中透過參考聯結子句中的 ID 來聯結表格。

  • 如果速度比磁碟空間更重要,且維護多個資料副本的成本很重要,例如在商業智慧情境中,您會分析大型表格中的所有資料,則可以放寬正規化規則,複製資訊或建立摘要表格以獲得更高的速度。