設計您的資料表,以盡量減少它們在磁碟上的空間。這可以藉由減少寫入和從磁碟讀取的資料量,來產生巨大的改進。較小的資料表通常需要較少的主記憶體,同時它們的內容在查詢執行期間被主動處理。任何資料表資料的空間縮減也會導致可以更快處理的較小索引。
MySQL 支援許多不同的儲存引擎(資料表類型)和列格式。對於每個資料表,您可以決定要使用的儲存和索引方法。為您的應用程式選擇適當的資料表格式可以為您帶來很大的效能提升。請參閱第 17 章,InnoDB 儲存引擎和第 18 章,替代儲存引擎。
您可以藉由使用此處列出的技術來獲得更好的資料表效能並最大限度地減少儲存空間
InnoDB
資料表預設會使用DYNAMIC
列格式建立。若要使用DYNAMIC
以外的列格式,請組態innodb_default_row_format
,或在CREATE TABLE
或ALTER TABLE
語句中明確指定ROW_FORMAT
選項。列格式的緊湊系列,包括
COMPACT
、DYNAMIC
和COMPRESSED
,以增加某些操作的 CPU 使用率為代價,減少列儲存空間。如果您的工作負載是受快取命中率和磁碟速度限制的典型工作負載,則它可能會更快。如果它是受 CPU 速度限制的罕見情況,則可能會較慢。當使用可變長度字元集 (例如
utf8mb3
或utf8mb4
) 時,緊湊的列格式系列也能最佳化CHAR
欄位的儲存。使用ROW_FORMAT=REDUNDANT
時,CHAR(
會佔用N
)N
× 字元集的最大位元組長度。許多語言主要可以使用單位元組的utf8mb3
或utf8mb4
字元編寫,因此固定儲存長度通常會浪費空間。使用緊湊的列格式系列時,InnoDB
會為這些欄位分配一個可變量的儲存空間,範圍從N
到N
× 字元集的最大位元組長度,方法是移除尾隨空格。最小儲存長度為N
個位元組,以便在典型情況下進行就地更新。如需更多資訊,請參閱 第 17.10 節「InnoDB 列格式」。若要透過以壓縮形式儲存表格資料來進一步減少空間,請在建立
InnoDB
表格時指定ROW_FORMAT=COMPRESSED
,或在現有的MyISAM
表格上執行 myisampack 命令。(InnoDB
壓縮表格是可讀寫的,而MyISAM
壓縮表格是唯讀的。)對於
MyISAM
表格,如果您沒有任何可變長度的欄位 (VARCHAR
、TEXT
或BLOB
欄位),則會使用固定大小的列格式。這會比較快,但可能會浪費一些空間。請參閱第 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 個字元以下。