2009-10-16 84 views
0

當我設置MySQL表時,它要求我定義列的名稱,輸入類型和長度。我的假設沒有讀到任何有關它的信息,這是爲了最小化。根據需要指定儘可能最小的int/smallint/tinyint,這會減少某種類型的開銷。如果這是所有的積極因素,使它無符號地加倍你的空間,等等。設置MySQL架構時,爲什麼要使用某些類型?

如果我只是使每個字段爲varchar-200個字符會發生什麼?何時/爲什麼這麼糟糕,我會錯過什麼,什麼時候會出現低效率? 100K記錄?

我每次創建數據庫時都會考慮這個問題,但是我沒有構建任何足夠的擴展功能,以至於我的方案設置不當,無論是「嚴格/小」還是「鬆散/大」 。有人可以證實我對速度和效率做出了很好的假設嗎?

謝謝!

回答

3

數據類型不僅優化了存儲,而且數據如何編制索引。隨着數據庫變大,顯而易見,搜索所有在整數字段中具有1的記錄比在varchar字段中具有「1」的記錄更快。當您從多個表中加入數據時,這變得尤爲重要,並且數據庫引擎不得不重複執行此類操作。 (Daren也正確地指出,重要的是你所匹配的字段類型也是一樣的。)

這些低效率成爲問題的級別很大程度上取決於你的硬件和應用程序設計。現在我們有足夠大的鐵,如果你正在構建中等規模的應用程序,你可能看不到明顯的差異。 (除了對你的數據庫設計感到有點內疚!)但是在小項目中建立良好的習慣使得大項目更容易。

+0

我想添加改變用於表連接的字段長度和類型,確保你總是在兩個地方改變它們。對於非相同的索引,表格連接幾乎和沒有索引一樣慢。 – 2009-10-16 19:58:01

0

如果你有兩列作爲varchar,並放入值10和20並添加它們,你會得到1020,而不是30,你可能會期望。

0

當然,您可以將所有內容保存爲VARCHAR字符串。但是你會放棄數據庫引擎提供的許多功能。

您應該選擇最接近列的預期用途的數據庫類型。例如,使用DATE或DATETIME存儲日期可爲您提供各種基本VARCHAR類型無法獲得的日期/時間函數。

同樣,用於統計事物或提供簡單唯一ID的字段應該是INT或其相關類型之一。還要記住INT只佔用4個字節,而9個數字的字符串至少使用9個字節。

對於字符數據,將NVARCHAR用於任何語言環境中用戶要輸入的國際化值(尤其是名稱和位置)是明智的選擇。如果您知道該文本僅限於美國或僅限內部使用,則VARCHAR是安全的。

相關問題