1. 列類型存儲需求
根據類別列出了mysql支持的每個列類型的存儲需求。
MyISAM表中行的最大大小為65,534字節。每個BLOB和TEXT列 賬戶只占其中的5至9個字節。
如果MyISAM表包括變長列類型,記錄格式也是可變長度。當創建表時,在某些條件下,mysql可以將一個列從變長類型改為固定長度的類型或反之亦然。
數值類型存儲需求
列類型 ? ?存儲需求 ? ?
TINYINT ? ?1個字節 ? ?
SMALLINT ? ?2個字節 ? ?
MEDIUMINT ? ?3個字節 ? ?
INT,?INTEGER ? ?4個字節 ? ?
BIGINT ? ?8個字節 ? ?
FLOAT(p) ? ?如果0
FLOAT ? ?4個字節 ? ?
DOUBLE [PRECISION], item?REAL ? ?8個字節 ? ?
DECIMAL(M,D),?NUMERIC(M,D) ? ?變長;參見下面的討論 ? ?
BIT(M) ? ?大約(M+7)/8個字節 ? ?
DECIMAL(和NUMERIC)的存儲需求與具體版本有關:
使用二進制格式將9個十進制(基于10)數壓縮為4個字節來表示DECIMAL列值。每個值的整數和分數部分的存儲分別確定。每個9位數的倍數需要4個字節,并且“剩余的”位需要4個字節的一部分。下表給出了超出位數的存儲需求:
剩余的 ? ?字節 ? ?
位數 ? ?數目 ? ?
0 ? ?0 ? ?
1 ? ?1 ? ?
2 ? ?1 ? ?
3 ? ?2 ? ?
4 ? ?2 ? ?
5 ? ?3 ? ?
6 ? ?3 ? ?
7 ? ?4 ? ?
8 ? ?4 ? ?
9 ? ?4 ? ?
日期和時間類型的存儲需求
列類型 ? ?存儲需求 ? ?
DATE ? ?3個字節 ? ?
DATETIME ? ?8個字節 ? ?
TIMESTAMP ? ?4個字節 ? ?
TIME ? ?3個字節 ? ?
YEAR ? ?1個字節 ? ?
字符串類型的存儲需求
列類型 ? ?存儲需求 ? ?
CHAR(M) ? ?M個字節,0?
VARCHAR(M) ? ?L+1個字節,其中L?
BINARY(M) ? ?M個字節,0?
VARBINARY(M) ? ?L+1個字節,其中L?
TINYBLOB,?TINYTEXT ? ?L+1個字節,其中L?
BLOB,?TEXT ? ?L+2個字節,其中L?
MEDIUMBLOB,?MEDIUMTEXT ? ?L+3個字節,其中L?
LONGBLOB,?LONGTEXT ? ?L+4個字節,其中L?
ENUM(‘value1′,’value2’,…) ? ?1或2個字節,取決于枚舉值的個數(最多65,535個值) ? ?
SET(‘value1′,’value2’,…) ? ?1、2、3、4或者8個字節,取決于set成員的數目(最多64個成員) ? ?
VARCHAR、BLOB和TEXT類是變長類型。每個類型的存儲需求取決于列值的實際長度(用前面的表中的L表示),而不是該類型的最大可能的大小。例如,VARCHAR(10)列可以容納最大長度為10的字符串。實際存儲需求是字符串(L)的長度,加上一個記錄字符串長度的字節。對于字符串’abcd’,L是4,存儲需要5個字節。
對于CHAR、VARCHAR和TEXT類型,前面的表中的值L和M應解釋為字符數目,并且列定義中的這些類型的長度表示字符數目。例如,要想保存一個TINYTEXT值需要L字符+ 1個字節。
要想計算用于保存具體CHAR、VARCHAR或者TEXT列值的字節數,需要考慮該列使用的字符集。在具體情況中,當使用Unicode時,必須記住所有Unicode字符使用相同的字節數。
注釋:VARCHAR列的有效最大長度為65,532字符。
NDBCLUSTER引擎只支持固定寬度的列。這說明MySQL簇中的表中的VARCHAR列的行為如同類型CHAR(不同的是每個記錄仍然有一個額外字節空間)。例如,在Cluster表中,聲明為VARCHAR(100)的列中的每個記錄存儲時將占用101個字節,無論實際存儲的記錄中的字符串的長度為多少。
BLOB和TEXT類需要?1、2、3或者4個字節來記錄列值的長度,取決于該類的最大可能的長度。
在NDB Cluster存儲引擎中,TEXT和BLOB列的實施是不同的,其中TEXT列中的每個記錄由兩個單獨部分組成。一個是固定大小(256字節),并且實際上保存在原表中。另一個包括超出256字節的任何數據,保存在隱含的表中。第2個表中的記錄總是2,000字節長。這說明如果size
ENUM對象的大小由不同的枚舉值的數目確定。枚舉用一個字節,可以有255個可能的值。當枚舉的值位于256和65,535之間時,用兩個字節。
SET對象的大小由不同的set成員的數量確定。如果set大小是N,對象占(N+7)/8個字節,四舍五入到1、2、3、4或者8個字節。SET最多可以有64個成員。
2.?選擇正確的數據類型
為了優化存儲,在任何情況下均應使用最精確的類型。例如,如果列的值的范圍為從1到99999,若使用整數,則MEDIUMINT UNSIGNED是好的類型。在所有可以表示該列值的類型中,該類型使用的存儲最少。
用精度為65位十進制數(基于10)對DECIMAL?列進行所有基本計算(+、-、*、/)。
使用雙精度操作對DECIMAL值進行計算。如果準確度不是太重要或如果速度為最高優先級,DOUBLE類型即足夠了。為了達到高精度,可以轉換到保存在BIGINT中的定點類型。這樣可以用64位整數進行所有計算,根據需要將結果轉換回浮點值。
3.?使用來自其他數據庫引擎的列類型
為了使用由其它賣方編寫的SQL執行代碼,MySQL按照下表所示對列類型進行映射。通過這些映射,可以很容易地從其它數據庫引擎將表定義導入到MySQL中:
其它賣方類型 ? ?MySQL類型 ? ?
BOOL, ? ?TINYINT ? ?
BOOLEAN ? ?TINYINT ? ?
CHAR VARYING(M) ? ?VARCHAR(M) ? ?
DEC ? ?DECIMAL ? ?
FIXED ? ?DECIMAL ? ?
FLOAT4 ? ?FLOAT ? ?
FLOAT8 ? ?DOUBLE ? ?
INT1 ? ?TINYINT ? ?
INT2 ? ?SMALLINT ? ?
INT3 ? ?MEDIUMINT ? ?
INT4 ? ?INT ? ?
INT8 ? ?BIGINT ? ?
LONG VARBINARY ? ?MEDIUMBLOB ? ?
LONG VARCHAR ? ?MEDIUMTEXT ? ?
LONG ? ?MEDIUMTEXT ? ?
MIDDLEINT ? ?MEDIUMINT ? ?
NUMERIC ? ?DECIMAL ? ?
在創建表時對列類型進行映射,然后原來的類型定義被丟棄。如果你使用其它賣方的類型創建一個表,然后執行DESCRIBE?tbl_name語句,MySQL使用等效的MySQL類型來報告表的結構。例如:
mysql>?CREATE?TABLE?t?(a?BOOL,?b?FLOAT8,?c?LONG,?d?NUMERIC);Query?OK,?0?rows?affected?(0.08?sec); mysql>?DESCRIBE?t; +-------+---------------+------+-----+---------+-------+ |?Field?|?Type??????????|?Null?|?Key?|?Default?|?Extra?| +-------+---------------+------+-----+---------+-------+ |?a?????|?tinyint(1)????|?YES??|?????|?NULL????|???????| |?b?????|?double????????|?YES??|?????|?NULL????|???????| |?c?????|?mediumtext????|?YES??|?????|?NULL????|???????| |?d?????|?decimal(10,0)?|?YES??|?????|?NULL????|???????| +-------+---------------+------+-----+---------+-------+ 4?rows?in?set?(0.00?sec)