java開發人員必看的mysql表設計指南,防止踩坑

java開發人員必看的mysql表設計指南,防止踩坑

表設計指南

·如果沒有特殊的情況, 建議選擇InnoDB引擎。

·每個表都應該有主鍵, 可選擇自增欄位, 或者整型欄位。 使用UNSIGNED整型可以增加取值的範圍。 例外的情況是, 一

些應用會頻繁地基於某些欄位進行檢索, 設計人員可能會認為這些欄位/欄位組合更適合做主鍵, 因為它們更自然、 更高效。

·儘量將欄位設定成NOT NULL。 如果沒有特殊的理由, 建議將欄位定義為NOT NULL。 如果將欄位設定成一個空字串或設定成0值並沒有什麼不同, 都不會影響到應用邏輯, 那麼就可以將這個欄位設定為NOT NULL。 NULL值的儲存需要額外的空間, 且會導致比較運算更為複雜, 這會使最佳化器更難以最佳化SQL。 當然, 是否設定為NULL更應取決於你的業務邏輯, 如果你確實需要, 那麼就設定它允許NULL值, NULL值雖然會導致比較運算更加複雜, 但這比因為定義了NOT NULL預設值而導致應用邏輯出現異常要好。

·使用更短小的列, 比如短整型。 整型列的執行速度往往更快。

·考慮使用垂直分割槽。 比如, 我們可以把大欄位或使用不頻繁的欄位分離到另外的表中, 這樣做可以減少表的大小, 讓表執行得更快。 我們還可以把一個頻繁更新的欄位放到另外的表中, 因為頻繁更新的欄位會導致MySQL Query Cache裡相關的結果集頻繁失效, 可能會影響效能。 需要留意的一點是, 垂直分割槽的目的是為了最佳化效能, 但如果將欄位分離了到分離表後, 又經常需要建立連線, 那可能就會得不償失了, 所以, 我們要確保分離的表不會經常進行連線, 這時, 用程式進行連線是一個可以考慮的辦法。

·儲存精確浮點數時必須使用DECIMAL替代FLOAT和DOUBLE。

·建議使用UNSIGNED型別儲存非負值。

·建議使用INT UNSIGNED儲存IPV4。 可以使用INET_ATON()、 INET_NTOA()函式進行轉換, PHP裡也有類似的函式如ip2long()、 long2ip()。

·整形定義中不新增顯示長度的值, 比如使用INT, 而不是INT(4)。

·建議不要使用ENUM型別。

·儘可能不要使用TEXT、 BLOB型別。

·在VARCHAR(N)中, N表示的是字元數而不是位元組數, 比如VARCHAR(255), 最大可儲存255個漢字。 需要根據實際的寬度來選擇N。 此外, N應儘可能地小, 因為在MySQL的一個表中, 所有的VARCHAR欄位的最大長度是65535個位元組, 進行排序和建立臨時表一類的記憶體操作時, 會使用N的長度申請記憶體(對於這一點, MySQL 5。7後有了改進) 。

·字符集建議選擇UTF-8。

·儲存年時使用YEAR型別。

·儲存日期時使用DATE型別。

·儲存時間時(精確到秒) 建議使用TIMESTAMP型別, 因為TIMESTAMP使用的是4位元組, DATETIME使用的是8個位元組。

·不要在資料庫中使用VARBINARY或BLOB儲存圖片及檔案等。 MySQL並不適合大量儲存這種型別的檔案。

·JOIN(連線) 欄位在不同表中的型別和命名要一致。

·如果變更表結構可能會影響效能, 則需要通知DBA稽核