MySQL性能優化-選擇適合的字段類型


1、字段類型設計原則

  • 更小的就是更好的:更小的字段類型通常更快,以為它們占用更小的磁盤、內存、緩存使用,降低I/O開銷,而且需要的CPU處理周期更短。
  • 簡單就好:簡單的數據類型需要更少的CUP周期
  • 盡量避免NULL:可為NULL的列會使用更多的存儲空間,當這個字段作為索引時,每個索引記錄需要一個額外的字節。
  • 不要用字符串存儲時間和數值,他們在存儲和排序上的差距較大

2、MySQL常用字段類型有:

  1)數值類型:

字段類型 大小(字節) 值范圍
tinyint 1 (-128,127)
smallint 2 (-32768,32767)
mediumint 3 (-2^23,2^23-1)
int/integer 4 (-2^31,2^31-1)
bigint 8 (-2^63,2^63-1)
float 4  
double 8  
decimal(m,n)    
  •   整數類型可設置寬度,如int(1)、int(11),事實上對大多數應用它是無意義的,它們的存儲是一樣,性能也是一樣,只是讓客戶端看到的信息不一樣。
  •   decimal(m,d)允許最多65個數字,m是最大精度,d是小數精度;CUP不支持decimal的直接計算,MySQL通過內部方式實現高精度計算,相對原生浮點類型,計算速度要慢。浮點類型(float、double)在存儲同樣范圍的值時,通常比decimal占用更少的空間,只有需要對小數進行精確計算時才使用decimal(例如財務數據)。

  2)字符類型:

字段類型 大小(字符) 說明
char 0-255 固定長度字符
varchar 0-65535 可變長字符
tinyblob    
blob    
mediumblob    
longblob    
tinytext   最多存255個字符
text   最多存65535字符
mediumtext    
longtext    
  • 字符的存儲方式跟引擎相關,我們這里說明的是InnoDB引擎。
  • 關於char和varchar
    • varchar可變字符串,相對char更節省存儲空間(表的ROW_FORMAT=FIXEX例外,它的每一行都使用定長存儲)
    • varchar需要額外的1或2個字節記錄字符串長度,當最大長度小於等於255時,使用1個字節,超過255時使用2個字節。例如varchar(10)需要11個字節存儲,varchar(1000需要1002個字節存儲。
    • varchar節省存儲空間,所以對性能有幫助。但由於行是變長的,所以update時可能使行變的更長,這樣就需要額外的工作。如果一個行占用空間增長且在頁內沒有更多的存儲空間,MyISAM會將行拆成不同的片段存儲,InnoDB則需要分裂頁來使行可以放到頁內。
    • 適合varchar類型的列:字符串列最大長度比平均長度大很多;列更新很少。char適合很短的或者長度接近的字符串。對於非常短的列,char存儲上更有效率。
    • char和varchar存儲的是字符,使用UTF-8字符串時,每個字符占用的字節數不同。
  • 關於blob和text類型
    • blob存儲的是2進制,沒有排序規則和字符集,text有排序規則和字符集
    • MySQL對blob和text的排序與其他類型不同,它只對每個列的最前max_sort_length字節而不是整個字符串排序。如果只需排序前面的一小部分,我們可以調整max_sort_length配置,或者使用order by sustering(column,length)
    • MySQL不能將blob和text的全部字符串進行索引,也不能使用這些索引消除排序。

  3)時間類型:

字段類型 大小(字節) 值范圍 顯示格式 說明
year 1 [1901,2155] yyyy  
date 3 [1000-01-01,9999-12-31] yyyy-MM-dd 日期
time 3   HH:mm:ss 時間
datetime 8   yyyy-MM-dd HH:mm:ss 日期和時間
timestamp 4   yyyy-MM-dd HH:mm:ss.SSS 時間戳,可精確微妙,精度的位數可定義。

  4)其他:

字段類型 說明
bit 二進制字符串,長度1-64
set 集合類型,存儲上實際是int類型
enum 枚舉類型,最多支持65535個枚舉項。枚舉類型內部使用int類型存儲
  • 在MySQL5前,bit是tinyint的同義詞。bit的行為因存儲引擎而已,MyISAM按位進行存儲,如bit(17)有17位,它使用3個字節存儲,Memory和InboDB位每個bit列使用足夠存儲的最少整形。MySQL把bit當做字符串類型,而不是數字類型。
  • 枚舉類型enum,最多有65535個枚舉項,但真使用這么多項我們的應用會非常復雜。枚舉適合少量枚舉且相對固定的數據。 
  • MySQL沒有bool(常用tinyint(1)或bit(1)表示布爾類型)、long類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM