1. 程式人生 > >MySQL 基礎數據類型優化(如何選擇數據類型)

MySQL 基礎數據類型優化(如何選擇數據類型)

高性能 amp 處理 字節 方便 集合 arc 大數 back

前言: 最近在看高性能 MySQL,記錄寫學習筆記: 高性能 MySQL 學習筆記(二) Schema與數據類型優化 筆記核心內容:MySQL 如何選擇正確的數據類型,各數據類型的差異; // 不要小看 MySQL 數據類型對性能的重要性, 當你的系統體量到達一定程度時,就知道這裏的性能差異了。 一、選擇優化的數據類型 // 更小的通常越好 盡量選擇使用可以正確存儲數據的最小數據類型。更小的數據類型通常更快, 因為它們占用更少的磁盤、內存和 CPU 緩存,並且處理時需要的 CPU 周期也更少; // 簡單最好
整型比字符型要好,兩個例子,應該使用 MySQL 內建的類型來存儲日期而不是字符串; 使用整形存儲 IP 地址。因為字符的校對、排序規則要復雜。 // 盡量避免 NULL 通常情況下最好指定列為 NOT NULL,除非真的需要存儲 NULL 值; 如果查詢中包含可為 NULL 的列,對 MySQL 來說更難優化, 因為可為 NULL 的列是的索引、索引統計和值比較,都更為復雜。 允許為 NULL 的列,存儲空間上占用更多,同時 MySQL 還需要對它特殊處理。 整數類型: 可以使用的幾種整數類型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 分別使用8,16,24,32,64位存儲空間。 整數類型有可選的 UNSIGNED 屬性,表示不允許負值,這大致可以使正數的上限提高一倍。 整數計算一般使用 64 位的 BIGINT 整數,即使 32 位環境也是如此(一些聚合函數是例外,他們使用DECIMAL或DOUBLE進行計算)。 MySQL 可以為整數類型指定寬度,例如 INT(11),對大多數應用這是沒有意義的; 它並不會限制值的合法範圍。 對於存儲和計算來說,INT(1) 和 INT(20) 是相同的。 實數類型:
FLOAT 和 DOUBLE 類型支持使用標準的浮點運算進行近似計算。 DECIMAL 類型用於存儲精確的小數,MySQL 服務器自身實現了 DECIMAL 的高精度計算, 相對而言,CPU直接支持原生浮點計算,所以浮點計算明顯更快。 浮點和 DECIMAL 類型都可以指定精度,對於 DECIMAL 可以指定小數點前後所允許的最大位數, 這會影響列的空間消耗。浮點類型在存儲同樣範圍的值時, 通常比 DECIMAL 使用更少的空間,所以應該盡量只在對小數進行精確計算時才使用。 DECIMAL(18, 9) 小數點兩點各存儲 9 個數字,一共使用 9 個字節; DECIMAL 可以存儲的整數比 BIGINT 還要大; 浮點型以及 DECIMAL 在存取時,都需要額外的空間和計算的開銷, 所以應該盡量只對小數進行精確計算時才使用 DECIAML; 如果數據量比較大的時候,可以考慮使用 BIGINT 代替 DECIAML。 // 這就是為什麽微信的數據庫(猜的因為接口都是分為單位)使用 BIGINT 來做處理,
目的就是為了節省 MySQL 計算帶來的額外損耗; 字符串類型: VARCHAR 存儲可變長字符串。 當列的更新很少,使用了像 UTF-8 這樣復雜的字符集時,使用 VARCHAR 存儲。 CHAR 類型是定長的,當存儲 MD5 值,定長的值,或經常變更的數據時,用 CHAR 存儲,因為這樣不容易產生碎片。 VARCHAR 類型存儲可變長字符串,他比定長類型更節省空間,VARCHAR 節省了存儲空間,所以對性能也有幫助,但由於是變長的, 在 UPDATE 時可能使行變得比原來長,這就導致需要做額外的工作。 存儲引擎存儲 CHAR 或者 VARCHAR 值的方式在內存中和硬盤上可能不一樣。 如果一個行占用的空間增長,並在業內沒有更多足夠的空間可以存儲時, MyISAM 存儲引擎會將拆分成不同的片段存儲;而 InnerDB 則需要分裂頁放進頁內才行; BLOB 和 TEXT 類型 MySQL 把每個 BLOB 和 TEXT 值當作一個獨立的對象處理。 兩者都是為了存儲很大數據而設計的字符串類型,分別采用二進制和字符方式存儲。 ENUM 枚舉類型: 有時候可以使用枚舉代替常用的字符串類型,枚舉把一些不重復的字符串存儲成一個預定義的集合。 枚舉在保存時是(數字-字符串)的形式。 將可優化的數據類型字段改為 ENUM 枚舉類型後,關聯查詢性能可提升將近一倍。(書中列子暫不細說) SELECT SQL_NO_CACHE COUNT(*) FROM tables JOIN tables2 USING(day, account...); 日期和時間類型: MySQL 使用許多類型保存日期和時間值,例如 Year 和 Date,MySQL 能存儲的最小時間粒度為秒。 MySQL 提供兩種相似的日期類型:DATETIME 和 TIMESTAMP, 在某些場合一個比另一個工作的更好。 DATETIME 這個類型保存的最大值從1001到9999年,精度為秒。 TIMESTAMP 使用 4 個字節保持日期,默認 NOT NULL。 除了特殊行為之外,通常也應該盡量使用 TIMESTAMP 類型。 位類型: BIT 最大長度 64 個位。MySQL 把 BIT 當作字符串類型,而不是數字類型。 // 很多開發人員喜歡使用 BIT 作為 BOOL 類型來存儲某些數據,true/false 這種,但是最好避免使用 BIT 類型。 如果想在一個 bit 的存儲空間中存儲一個 true/false 的話,建議使用一個可以為空的 CHAR(0) 類型。 同時也可以考慮使用 SET 類型,SET 類型 MySQL 內部是以一系列打包位的集合來表示的, MySQL 有像 FIND_IN_SET 和 FIELD 這樣的函數,方便在查詢中使用。 他的主要缺點是改變列的代價太高,也無法在SET上通過索引查找。

MySQL 基礎數據類型優化(如何選擇數據類型)