標籤:
高效能MySql閱讀筆記第四章--Schema與資料類型最佳化閱讀筆記
良好的邏輯設計和實體設計是高效能的基石,應該根據系統將要執行的查詢語句來設計schema,這往往需要權衡各種因素。
本章主要為接下來的索引最佳化與查詢最佳化做鋪墊,覆蓋了MySql特有的schem設計方面的主題:
一.選擇最佳化的資料類型
Mysql支援的資料類型非常多,選擇正確的資料類型對於獲得高效能至關重要。在為列選擇資料類型時,第一步需要確定合適的大類型,下一步是選擇具體類型相同大類型下的不同子類型資料有時也有一些特殊的行為和屬性。
1.更小的資料類型通常更好
2.簡單就好
3.盡量避免NULL
二.整數類型
可以使用的幾種整數類型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分別使用8,16,24,32,64位儲存空間。
整數類型有可選的UNSIGNED屬性,表示不允許負值,這大致可以使正數的上限提高一倍。
整數計算一般使用64位的BIGINT整數,即使32位環境也是如此(一些彙總函式是例外,他們使用DECIMAL或DOUBLE進行計算)。
三.實數類型
FLOAT和DOUBLE類型支援使用標準的浮點運算進行近似計算。DECIMAL類型用於儲存精確的小數,Mysql伺服器自身實現了DECIMAL的高精度計算,相對而言,CPU直接支援原生浮點計算,所以浮點計算明顯更快。
浮點和DECIMAL類型都可以指定精度,對於DECIMAL可以指定小數點前後所允許的最大位元,這會影響列的空間消耗。
浮點類型在儲存同樣範圍的值時,通常比DECIMAL使用更少的空間,所以應該盡量只在對小數進行精確計算時才使用。
四.字串類型
VARCHAR和CHAR是兩種最主要的字串類型。
VARCHAR類型儲存可變長字串,他比定長類型更節省空間的,VARCHAR節省了儲存空間,所以對效能也有協助,但由於是變長的,在UPDATE時可能使行變得比原來長,這就導致需要做額外的工作。
CHAR是定長的,適合儲存很短的字串(末尾會用空格填充)。
五.BLOB和TEXT類型
Mysql把每個BLOB和TEXT值當作一個獨立的對象處理。
六.使用枚舉(ENUM)代替字串類型
有時候可以使用枚舉代替常用的字串類型,枚舉把一些不重複的字串儲存成一個預定義的集合。枚舉在儲存時是(數字-字串)的形式。
七.日期和時間類型
Mysql使用許多類型儲存日期和時間值,例如year和date,Mysql能儲存的最小時間粒紋為秒,Mysql提供兩種相似的日期類型:DATETIME和TIMESTAMP,在某些場合一個比另一個工作的更好。
DATETIME
這個類型儲存的最大值從1001到9999年,精度為秒。
TIMESTAMP使用4個位元組保持日期,預設NOT NULL。
八.位元據類型
BIT 最大長度64個位。Mysql把BIT當作字串類型,而不是數字類型。
SET 一系列打包位的集合。Mysql有像FIND_IN_SET和FIELD這樣的函數,方便在查詢中使用。他的主要缺點是改變列的代價太高,也無法在SET上通過索引尋找。
九.選擇標識符。通常為整數類型和字串。
十.特殊類型資料,例如毫秒級時間,IP地址,可以在使用時進行相應轉換。
高效能MySql-Schema與資料類型最佳化1