一、三個原則
- 更小的通常更好:在符合條件的情況下,選擇最小的數據類型更好。因爲它們佔用更少的磁盤、內存和 CPU 緩存。
- 簡單就好:簡單的數據類型的操作通常需要更少的 CPU 週期。比如,使用整型存儲 IP 地址。
- 儘量避免 NULL:如果查詢中包含可爲 NULL 的列,對 MySQL 來說更難優化,因爲可爲 NULL 的列使得索引、索引統計和值比較都更負責。不過一般將 NULL 的列改爲非 NULL 性能提升比較小,在對應列建索引時應避免設計爲可爲 NULL。
二、整數類型
- 存儲整數,可以使用的類型及存儲空間如下
- 整數類型有可選的 UNSIGNED 屬性,表示不允許負值,這基本可以使正數的上限提升一倍
- 整數計算一般使用 64 位的 BIGINT 整數。
- MySQL 可以爲整數類型指定寬度,比如 INT(11),對大多數應用來說是沒有意義的,對於存儲來說也沒有影響。
三、實數類型
- 可以使用 DECIMAL 存儲比 BIGINT 還大的整數。
- DECIMAL 用於存儲精確的小數,並能進行精確計算。
- DECIMAL 類型可以指定精度。存儲佔用是每 4 個字節存 9 個數字。比如 DECIAML(18,9)小數點兩邊個存儲 9 個數字,一共佔用 9 個字節:小數點前後數字各用 4 個字節,小數點本身佔 1 個字節。
- DECIMAL 只是一種存儲格式,在計算時會轉換爲 DOUBLE 類型。並且 DECIMAL 佔用空間比 FLOAT 和 DOUBLE 大,如果只是存儲不計算,可以使用 FLOAT。
- 數據量大的情況下,可以使用 BIGINT 替代,進行相應位數的乘除倍數就行,存儲比 DECIMAL 小,計算精確。
四、VARCHAR 和 CHAR 類型
- varchar
① varchar 是變長的,比定長更節省空間,因爲它僅使用必要的空間。
② varchar 需要使用 1 或 2 個額外字節記錄字符串的長度。如果列長 <= 255 個字節,使用 1 個字節記錄長度,否則使用 2 個字節。
③ InnoDB 會把過長的 VARCHAR 類型存儲爲 BLOB - char
① char 類型是定長的。當存儲 char 值時, MySQL 會刪除所有的末尾空格
② char 適合存儲很短的字符串,或所有值都接近同一個長度 - 兩者使用區別
① 對於經常變更的列,使用 char 更好,因爲定長的 char 不容易產生碎片,而 varchar 容易產生。
② 對於非常短的列,適合 char ,因爲使用 varchar 還是多個字節存儲長度
③ 使用 UTF-8 這樣的字符集,適合 varchar 變長存儲
④ 注意: 使用 varchar 時,比如 varchar(5) 和 varchar (100) 都能滿足時,最好使用短的。因爲雖然存儲時只使用了具體值大小的空間,但是在使用內存臨時表進行操作時會很糟糕,Memory 引擎只支持定長的行,變長字段也會根據最大長度分配。 - varchar 和 char 對行尾空格的處理
①. 創建表
②. 查詢-- 建表 CREATE TABLE `char_test` ( char_col CHAR(10) COMMENT 'char類型', varchar_col VARCHAR(10) COMMENT 'varchar類型' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 插入數據 insert into char_test(char_col, varchar_col) VALUE ('string1','string1'),(' string2',' string2'),('string3 ','string3 ');
③. 結果select CONCAT("'",char_col,"'") as char_col from char_test; select CONCAT("'",varchar_col,"'") as varchar_col from char_test;
char 類型的 char_col:
varchar 類型的 varchar_col:
④. 結論:char 類型存儲字符會剔除末尾的空格,而 varchar 存儲會保留所有字符。