MySQL數據類型選擇優化

  1. 選擇正確的數據類型對於得到高性能相當重要,數據類型選擇能夠有如下原則:mysql

    1,更小的一般更好;更小的數據類型一般更快,由於它們佔用更少的磁盤,內存,CPU緩存,處理時須要的 CPU週期也少。sql

    2,簡單就好;簡單的數據類型一般須要更少的CPU處理週期,好比整型比字符串類型操做代價更低,由於字符集和校對規則使字符比較比整理更復雜,好比:一般能夠使用內建日期來代替字符串存儲日期,整型來存儲IP地址;數據庫

    3,儘可能避免NULL;Null對於mysql來講更難優化,若是要列要加索引,儘可能設置Not NULL;緩存


  2. 具體類型選擇oracle

    上面第一步肯定了合適的大類型:數字,字符串,日期等,而後就是具體類型的選擇了,MySQL能夠存儲相同的數據類型,好比:datetime,timestamp,可是須要的物理空間不一樣(內存,磁盤空間),timestamp只佔用了datetime一半的存儲空間,timestamp容許的時間範圍要小得多。性能

    基本類型選擇規則:優化

    1)整數類型:兩種類型的數字,整數和實數;tinyint,smallint,mediumint,int,bigint(8,16,24,32,64位,能夠存放-2^7-2^7-1的數據),無符號類型與有符號類型佔用一樣的空間(0-255與-128-127),可是無符號數據範圍擴大一倍。spa

    備註:排序

    MySQL能夠爲整形指定寬度,INT(11),對大多數應用是沒有意義的,它不會限制合法的範圍,只是對mysql客戶端限制了顯示字符的個數,存儲和計算來講INT(20)與INT(1)是同樣的。索引

    整數計算,mysql採用的是64位BIGINT整數,32位環境也是如此。

    2)實數類型:Decimal(18,9),mysql5.0以上版本將數字打包保存到一個二進制字符串(4個字節存9個數字, 2^(4*8-1));Decimal最多65個數字。Decimal只是做存儲使用,計算時會換算成Double。

    Decimal(18,9):小數點先後各佔4byte,小數點1byte,4+1+4=9byte

    Decimal須要額外的空間和計算開銷,應該儘可能在小數計算時才使用Decimal(財務數據),但在數據量比較大的時候,能夠考慮用bigint替代Decimal,好比:123.123 = 123123 (整數)/1000(精確度),這樣能夠避免浮點運算不精確,也減小了爲精確計算使用Decimal的代價。

    浮點類型比Decimal佔用更少的空間,Float 4byte,Double 8byte,和整數類型同樣,只是佔用空間不一樣,實際上實數運算時mysql仍是會採用double來計算

    3)字符串類型:Varchar/Char

    Varchar:可變長存儲,比定長存儲節省空間;varchar須要額外1-2byte記錄字符串長度,若是列的最大長度<=255,使用1byte表示,不然2byte表示,varchar(1000)實際須要1002bytes表示。

    char:定長,自動截斷字符串尾部空格,不易產生碎片,char(1),varchar(1)分別會佔用1,2個字節。適合存儲定長字符串,好比MD5值。

    varchar(5)與varchar(255)存儲"hello"的空間開銷是同樣的,可是內存開銷和排序是不同的。

    binary/varbinary:存儲二進制字符串(字節碼,空表示爲\0)

    備註:utf-8字符集的varchar(1000)列,每一個字符3bytes,最大佔用空間=3*1000bytes。這裏之前有一種誤解,varchar(1000)存儲utf-8字符時,存儲了1000/3個字符,實際是存儲了1000個字符,只是佔用空間是3kbytes,因此mysql5.0以上varchar的存儲單位是字符,可是oracle數據庫是以字節爲單位

    4)BLOB/TEXT類型:分別採用二進制和字符方式存儲

    5)日期和時間類型:mysql可以存儲最小時間粒度爲秒(MariaDB 支持微秒級別)

    datetime:1001-9999年,精度秒,8bytes,與時區無關

    timestmp:保存1970-1-1以來的秒數,4bytes,與時區有關

    5)位類型:  bit:mysql看成字符串類型來存放,bit(1)表示二進制0/1值的字符串,儘可能避免使用。

相關文章
相關標籤/搜索