1. 優化數據類型
1.0 幾個簡單的原則
1.更小的通常更好:儘量選擇可以正確存儲數據的最小數據類型。如int-->tinyint,
2.簡單就好:使用更少耗費cpu的類型。如整形比字符串操作代價更低;使用mysql內建的時間/日期類型而不是字符串存儲時間;使用整數存儲ip地址等等
3. 儘量避免 null 。如果查詢帶有null的列,對mysql來說更難優化。null使索引、索引統計、值比較都更加複雜。
1.1 整數類型
1儘量確定整數的範圍並使用對應的整形,tinyint/int/smallint/bigint等。
2如果只有整數,不妨在之後加上unsigned 修飾
3. 雖然int可以指定長度。如int(11),但這只是規定了顯示的字符個數,實際上存儲和計算的仍是int類型的數值。比如int(1)和int(20)只是顯示的值不同。
1.2 實數類型
1 使用decimal 可以用來存儲比bigint還大的數據。
2 使用bigint 來避免浮點型計算不精確以及decimal 精確計算代價高的問題。例如,存儲財務數據,單位爲萬元時,存在小數的情況。可以直接使用單位爲元或者/角/分的更小單位的bigint數值來替代。
1.3 字符串類型
先講char和varchar
varchar 用來存儲不定長的字符串,它比定長類型更省空間(除非使用row_format=fixed創建,每一行都會使用定長字符串)。
varchar需要使用額外1或2字節存儲字符長度。如果長度<=255,則使用1字節,否則使用2字節。
varchar由於更新變長時,myisam和innodb的處理方式不同。myisam會將行拆分成不同的片段存儲,innodb則進行分裂頁來使行可以放入頁內。innodb還會將過長的varchar轉換爲blob
適合varchar 的場景:
字符串列最大長度比平均長度大很多;
字符串列更新少;
使用了utf-8等複雜的字符集。
blob和text
blob 存儲二進制,text存儲文本。
對blob和text進行排序時,只會對每列的前max_sort_length 字節進行排序。如果非要對其進行排序可以更改此變量值,或者使用 ` order by sustring(coulmn,length)`。
1.4 日期和時間類型
datetime和timestamp都可以存儲相同類型的數據:時間和日期(精確到秒)。但是timestamp只花費前者一半的存儲空間。但是其允許的時間範圍稍小。