MySQL數據類型與架構優化

MySQL選擇優化的數據類型
更小的通常更好
:儘量使用可以正確存儲數據的最小數據類型。更小的數據類型通常更快,因爲他們佔用更少的的磁盤、內存和CPU緩存,並且處理時需要的CPU週期更少。
簡單就好:簡單的數據類型的操作通常需要更少的CPU週期。例如,整形比字符串操作代價低;使用MySQL內建的類型(date,time,datetime)存儲日期和時間,而不是字符串;使用整形存儲IP地址。
避免使用NULL:通常情況下最好指定列爲NOT NULL。如果查詢中包含可爲NULL的列,對於MySQL來說更難優化。可爲NULL的列使得索引、索引統計和值的比較都更復雜。可爲NULL的列會使用更多的存儲空間,在MySQL裏也需要特殊處理。可爲NULL的列被索引時,每個索引記錄需要一個額外的字節。如果在列上建立索引,應該儘量避免設計成可爲NULL的列。
爲列選擇數據類型時,首先需要確實合適的大類型:數字、字符串、時間等;下一步確定具體類型,MySQL很多數據類型可以存儲相同的數據,只是存儲的長度和範圍不一樣、允許的精度不同,或者需要的物理空間(磁盤和內存空間)不同。


數值類型:
1)BIT,默認1bit,最大可以爲64bit
mysql>create table bittest(a bit(8));
mysql>insert into bittest values(b'00111001')


2)BOOL,BOOLEAN。TINYINT(1)的同義詞。
3)整數(whole number)和實數(real number)
整數類型:TINYINT(8bit)、SMALLINT(16bit)、MEDIUMINT(24bit)、INT(32bit)、BIGINT(64bit)。存儲範圍:-2^(N-1) 到2^(N-1)-1。整數有可選的UNSIGNED屬性。
MYSQL可以爲整數指定寬度,如INT(11),對於大多數應用沒有意義,只是規定了MySQL的一些交互工具(如MySQL命令行客戶端)用來顯示字符的個數。


實數:
Fixed-Point Type
(定點類型,精確值):DECIMAL,NUMERIC
NUMERIC被實現爲DECIMAL,MYSQL用二進制形式存儲DECIMAL。
DECIMAL可以指定小數的精度(precision,總的位數)和小數點後面的位數(scale)
DECIMAL(5,2)可以表示的數字範圍大小爲:-999.99~999.99


Float-Point Type (浮點類型,近似值): Float,DOUBLE
FLOAT(4Byte)、DOUBLE (8Byte)
MySQL支持可選的精度指定,精度值也確定了數字的存儲空間的大小,精度爲0~23時使用4Byte的單精度FlOAT,精度爲24~52時使用*8Byte的雙精度DOUBLE。
MySQL允許非標準的語法,MySQL permits a nonstandard syntax: FLOAT(M,D) or REAL(M,D) or DOUBLE PRECISION(M,D). “(M,D)” means than values can be stored with up to M digits in total, of which D digits may be after the decimal point.M表示總數字總的位數,D表示小數點後面的位數。
MySQL將數字打包保存到一個二進制字符串中,(每4個字節Bytes存9個數字)。例如,DECIMAL(18,9)小數點兩邊個存儲9個數字,小數點本身佔用一個字節,一共使用9個字節。


日期和時間類型
DATE :日期,沒有時間部分
TIME :時間,沒有日期部分
DATETIME: 使用8個字節存儲空間。DATETIME值的表示形式爲'YYYY-MM-DD HH:MM:SS',表示的時間範圍爲:'1000-01-01 00:00:00' to '9999-12-31 23:59:59'.
TIMESTAMP:使用4個字節存儲空間,和Unix時間戳項同,保存了從1970年1月1日午夜(格林尼治標準時間)以來的秒數。表示的時間範圍爲:'1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.
YEAR:年份


字符串
VARCHAR
:可變長字符串,需要使用1或2個額外的字節記錄字符串的長度。一下情況使用VARCHAR比較合適,字符串列的最大長度比平均長度大很多;列的更新很少,所以碎片不是問題;使用像UTF-8這樣複雜的字符集,每個字符使用不同的字節數進行存儲。
CHAR:MySQL總是根據定義的字符串長度分配足夠的空間。
BLOBTEXT:爲存儲很大的數據而設計的字符串數據類型,分別採用二進制和字符方式存儲。他們分別屬於不同的數據類型家族:
二進制類型:TINYBLOB、SMALLBLOB、BLOB、MEDIUMBLOB、LONGBLOB;BLOB是SMALLBLOB的同義詞
   字符類型:TINYTEXT、SMALLTEXT、TEXT、MEDIUMTEXT、LONGTEXT;TEXT是SMALLTEXT的同義詞
MySQL把BLOB和TEXT值當作一個獨立的處理對象,存儲引擎在存儲時通常會做特殊處理。當BLOB和TEXT值太大時,InnoDB會使用專門的外部存儲區域進行存儲,此時每個值在行內需要1~4個字節存儲一個指針,然後在外部存儲區域存儲實際的值。
BINARY:二進制字符串,存儲的是字節碼。BINARY填充的是\0(零字節)而不是空格。
VARBINARY:二進制字符串,存儲的是字節碼。
ENUM:枚舉類型

SET:如果需要保存很多true/false值,可以合併這些列到一個SET數據類型。


參考資料:

高性能MySQL(第三版)

MySQL5.6參考手冊:MySQL Reference Manual

   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章