MySQL Schema與數據類型的優化

選擇優化的數據類型:html

一、 更小的一般更好:mysql

通常狀況下,應該儘可能使用能夠正確存儲數據的最小數據類型。更小的數據類型一般更快,由於他們佔用更少的磁盤,內存和cpu緩存,而且處理時須要的cpu週期也更少。sql

二、 簡單就好數據庫

簡單的數據類型操做一般須要更少的cpu週期。例如,整型比字符操做代價更低,由於字符集和校對規則(排序規則)使字符比較比整型更加複雜。注:應使用mysql內建的類型存儲時間和日期,而不是字符串。緩存

三、 儘可能避免null服務器

若是查詢中包含可爲null的列,對Mysql來講更難優化,由於可爲null的列使得索引、索引統計和值都比較複雜。可爲null的列會使用更多的存儲空間,在mysql中也須要特別處理。當可爲null的列被索引時,每一個索引記錄須要一個額外的字節。架構

一般把可爲null的列改成not null帶來的性能提高比較小。在調優時,沒有必要首先在現有的schema中查找並修改掉這個狀況,除非肯定這會致使問題。可是若是列上建索引,就應儘可能避免設計成可爲null的列。性能

整數類型:優化

整數類型有TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分別使用8,16,24,32,64位存儲空間。他們能夠存儲的值的範圍從-2的(n-1)次方到2的(n-1)次方-1,其中n是存儲空間的位數。操作系統

整數類型有可選的UNSIGNED屬性,表示不容許負值,這大體能夠是正數的上限提升一倍。例如TINYINT UNSIGNED能夠存儲的範圍是0~255,而TINYINT的存儲範圍是-128~127。

實數類型:

實數是帶有小數部分的數字。而後,他們不只僅爲了存儲小數部分;也可使用DECIMAL存儲比BITINT還大的整數。MYSQL既支持精確類型,也支持不精確類型。

DECIMAL類型用於存儲精確的小數,由於double類型和float類型在進行計算時,會由於精度損失致使一些數據的誤差。可是DECIMAL數據類型cpu不支持對其直接計算,cpu直接支持原生浮點計算,因此浮點運算明顯更快。

由於須要額外的空間和計算開銷,因此應該儘可能只在對小數進行精確計算時才使用DECIMAL-例如存儲財務數據。可是在數據量比較大的時候,能夠考慮使用BITINT代替DECIMAL,將須要存儲的貨幣單位根據小數的位數乘以相應的倍數便可。

字符串類型(varchar和char)
Varchar:

Varchar類型用於存儲可變長字符串,是最多見的字符串類型。他比定長類型更節省空間,由於它僅使用必要的空間(例如,越短的字符串使用越少的空間)。因此,varchar節省了存儲空間,對性能也有幫助。可是,因爲行是邊長的,在update是可能使行變得比原來更長,這就致使須要作額外的操做。若是一個行佔用的空間增加,而且頁內沒有更多的空間存儲。MyISAM會將行拆成不一樣的片斷存儲,InnoDB則須要分裂頁來使行能夠放進頁內。

注:InnoDB更加靈活,它能夠把過長的varchar存儲爲BLOB。

Char類型:

Char類型適合存儲很短的字符串,或者全部值都接近同一個長度。例如,char類型很是適合存儲密碼的md5值,由於他是定長的值。還有用戶的身份證號以及手機號碼。對於常常變動的數據,char也比vachar更好,由於定長的char類型不容易產生碎片。對於很是短的列,char也比varchar在存儲空間上更有效率。例如用char(1)存儲Y和N的值,若是採用單字節字符集只須要一個字節,可是varchar(1)卻須要兩個字節,由於還有一個記錄長度的額外字節。

Varchar(5)和varchar(200)存儲‘hello’時空間開銷是同樣的,可是Varchar(5)會有很大的優點,由於更長的列會消耗更多的內存,由於Mysql一般會分配固定帶下的內存塊來保存內部值。尤爲是使用內存臨時表進行排序和操做時會特別糟糕。在利用磁盤臨時表進行排序時也一樣糟糕。

時間類型

DateTime和TimeStamp
DateTime

這個類型能保存大範圍的值,從1001年到9999年,精度爲秒。它把日期和時間封裝到格式爲YYYYMMDDHHMMSS的整數裏,與時區無關。使用8個字節的存儲空間。
TimeStamp:

存儲1970年1月1日午夜以來的描述,他和Unix時間戳相同。TimeStamp只使用4個字節的存儲空間,所以它的範圍比DateTime小的多;只能表示從1970年到2038年。

TimeStamp顯示的值也依賴於時區。Mysql服務器,操做系統,以及客戶端鏈接都有時區設置。

TimeStamp也有DATETIME沒有的特殊屬性。默認狀況下,若是插入時沒有指定第一個TimeStamp列的值,Mysql會設置這個列的值爲當前時間。在插入一行記錄時,Mysql默認也會更新第一個TimeStamp列的插入和更新操做。最後,TimeStamp列默認爲not null,這也和其餘的數據類型不同。

更多MySQL數據庫相關技術請看上海尚學堂《MySQL雲數據庫服務的架構探索

相關文章
相關標籤/搜索