MySQL(1)——數據類型的選擇(一)

一、三個原則

  1. 更小的通常更好:在符合條件的情況下,選擇最小的數據類型更好。因爲它們佔用更少的磁盤、內存和 CPU 緩存。
  2. 簡單就好:簡單的數據類型的操作通常需要更少的 CPU 週期。比如,使用整型存儲 IP 地址。
  3. 儘量避免 NULL:如果查詢中包含可爲 NULL 的列,對 MySQL 來說更難優化,因爲可爲 NULL 的列使得索引、索引統計和值比較都更負責。不過一般將 NULL 的列改爲非 NULL 性能提升比較小,在對應列建索引時應避免設計爲可爲 NULL。

二、整數類型

  1. 存儲整數,可以使用的類型及存儲空間如下
    存儲整數的類型和佔用空間
  2. 整數類型有可選的 UNSIGNED 屬性,表示不允許負值,這基本可以使正數的上限提升一倍
  3. 整數計算一般使用 64 位的 BIGINT 整數。
  4. MySQL 可以爲整數類型指定寬度,比如 INT(11),對大多數應用來說是沒有意義的,對於存儲來說也沒有影響。

三、實數類型

  1. 可以使用 DECIMAL 存儲比 BIGINT 還大的整數。
  2. DECIMAL 用於存儲精確的小數,並能進行精確計算。
  3. DECIMAL 類型可以指定精度。存儲佔用是每 4 個字節存 9 個數字。比如 DECIAML(18,9)小數點兩邊個存儲 9 個數字,一共佔用 9 個字節:小數點前後數字各用 4 個字節,小數點本身佔 1 個字節。
  4. DECIMAL 只是一種存儲格式,在計算時會轉換爲 DOUBLE 類型。並且 DECIMAL 佔用空間比 FLOAT 和 DOUBLE 大,如果只是存儲不計算,可以使用 FLOAT。
  5. 數據量大的情況下,可以使用 BIGINT 替代,進行相應位數的乘除倍數就行,存儲比 DECIMAL 小,計算精確。

四、VARCHAR 和 CHAR 類型

  1. varchar
    ① varchar 是變長的,比定長更節省空間,因爲它僅使用必要的空間。
    ② varchar 需要使用 1 或 2 個額外字節記錄字符串的長度。如果列長 <= 255 個字節,使用 1 個字節記錄長度,否則使用 2 個字節。
    ③ InnoDB 會把過長的 VARCHAR 類型存儲爲 BLOB
  2. char
    ① char 類型是定長的。當存儲 char 值時, MySQL 會刪除所有的末尾空格
    ② char 適合存儲很短的字符串,或所有值都接近同一個長度
  3. 兩者使用區別
    ① 對於經常變更的列,使用 char 更好,因爲定長的 char 不容易產生碎片,而 varchar 容易產生。
    ② 對於非常短的列,適合 char ,因爲使用 varchar 還是多個字節存儲長度
    ③ 使用 UTF-8 這樣的字符集,適合 varchar 變長存儲
    注意: 使用 varchar 時,比如 varchar(5) 和 varchar (100) 都能滿足時,最好使用短的。因爲雖然存儲時只使用了具體值大小的空間,但是在使用內存臨時表進行操作時會很糟糕,Memory 引擎只支持定長的行,變長字段也會根據最大長度分配。
  4. 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:
    char_col
    varchar 類型的 varchar_col:
    varchar_col
    ④. 結論:char 類型存儲字符會剔除末尾的空格,而 varchar 存儲會保留所有字符。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章