選擇優化的數據類型

選擇優化的數據類型

數據類型的選擇原則性能

  • 更小的一般更好。通常狀況下,應該儘可能使用能夠正確儲存數據的最小數據類型。例如只須要存0~200,tinyint unsigned更好。
  • 簡單就好。簡單數據類型的操做一般須要更少的CPU週期。例如,整型字符串操做代價更低,由於字符集和校對規則(排序規則)使字符比較比整型比較更復雜。好比,應該使用MySQL內建的類型而不是字符串來存儲日期和時間,另一個是應該用整型存儲IP地址。
  • 儘可能避免NULL, 一般狀況下最好指定列爲not null, 除非真的須要存儲null值。一般把null的列改成not null帶來的性能提高比較小,因此調優時沒有必要首先在現有schema中查找並修改掉這種狀況,除非肯定這會致使問題。可是,若是計劃在列上建索引,就應該儘可能避免設計成可爲null的列。

MySQL支持別名,但它不會影響性能。優化

整型

分爲整型和實數。若是儲存整數。可使用:tinyint、smallint、mediumint、int、bigint,分別使用8,16,24,32,64位存儲空間,儲存的值的範圍從-2^(N-1)到2^(N-1)-1,其中N是存儲空間的位數。spa

整型類型有可選的unsigned屬性,表示不容許負號,這大體可使正數的上限提升一倍。同時有符號和無符號類型(表示正負數)使用相同的儲存空間,並具備相同的性能。設計

實數類型

實數是帶有小數部分的數字。也可使用decimal存儲比bigint還大的整數。code

浮點(float、double)和decimal類型均可以指定精度。浮點類型在存儲一樣範圍的值時,一般比decimal使用更少的空間。由於須要額外的空間和計算開銷,應該只在對小數進行精確計算時才使用decimal——例如存儲財務數據。blog

字符串類型

varchar和char類型,下面的描述假設使用的存儲引擎是InnoDB/MyISAM。排序

  • varchar類型用於存儲可變長字符串。它比定長類型更節省空間,由於它僅使用必要的空間(例如,越短的字符串使用越少的空間)。 varchar的使用場景:字符串列的最大長度比平均長度大不少;列的更新不多;使用了像UTF-8這樣複雜的字符集,每一個字符都使用不一樣的字節數進行存儲。
  • char類型是定長的:MySQL老是根據定義的字符串長度分配足夠的空間。char類型使用場景:適合存儲很短的字符串,或者全部值都接近同一個長度。好比:很是適合存儲密碼的MD5值,由於這是一個定長的值。儲存常常變動的數據,char也比varchar更好,由於定長的char類型不容易產生碎片。對於很是短的列,char比varchar在存儲空間上也更有效率,由於它不須要額外字節記錄字符串的長度。例如用char(1)來存儲只有Y和N的值。

最好的策略是隻分配真正須要的空間。索引

Blob和text類型

Blob和text都是爲了存儲很大的數據而設計的字符串數據類型,分別採用二進制和字符方式存儲。ci

使用枚舉(Enum)代替字符串類型

使用場景:
枚舉列能夠把一些不重複的字符串存儲成一個預約義的集合而且除非能接受只在列表末尾添加元素,由於字符串列表是固定的,對於一系列將來可能會改變的字符串,使用枚舉不是一個好主意。字符串

優勢:
enum關聯enum後,關聯查詢變得更快。當varchar列和enum列進行關聯時則慢不少。
把varchar列轉換爲enum可讓表的大小縮小,能夠根據show table status命令輸出結果中data_length列的值。

位數據類型

bit列,列在一列中存儲一個或多個true/false值。對於大部分應用,最好避免使用這種類型,另外一個方法是建立一個char(1),用來存儲0/1。

set列,若是須要保存不少true/false值,能夠考慮合併這些列到一個set數據類型,它在MySQL內部是以一些列打包的位的集合來表示的。建議set列中的狀況會同時出現時使用。
這樣有效地利用了存儲空間。一個包裝位的應用的例子是保存權限的訪問控制列表(ACL)。

CREATE TABLE acl(
    perms SET('can_read','can_wrtie','can_delete') NOT NULL
);

INSERT INTO acl(perms) VALUES('can_read,can_delete');
SELECT perms FROM acl WHERE FIND_IN_SET('can_delete',perms);--查詢字段perms中包含can_delete的結果,返回結果爲null或記錄

結果:
image.png

相關文章
相關標籤/搜索