如何为MySQL选择更合适的数据类型
更小的通常更好
在表設計最開始之初,我認為這里的選擇合適的數據類型是非常關鍵的,他可以盡可能減輕數據庫的硬盤占用,和在查詢的過程中越簡單越小的數據類型則需要的占用了更小的cpu緩存,內存,硬盤,和相對應的處理cpu的周期。
簡單就好
數據類型的選擇應該保持越簡單越好的準則, 比方說整形比起字符類型來說的代價更低,因為字符類型的校對規則和排序規則相對于整形來說更加復雜。
應該使用mysql 的內建類型而不是選擇字符串來進行存儲日期和時間,也應該使用整形來存儲ip地址。
盡量避免NULL
而且應該避免使用null類型,因為NULL對MySQL來說會更難進行優化,null列會使得索引、索引統計、和值比較發生更為復雜的變化,并且為null的列會使用更多的儲存空間在MySQL中也需要更特殊的處理,當null被索引的時候
每個索引記錄會需要一個額外的字節,在myisam 中甚至會導致固定大小的索引(例如只有一個整數列索引)變成可變大小的索引。通常null的列改為not null 帶來的性能提升比較小,所以(調優時)沒有必要首先在現有的數據表
中查找并且修正?,除非確定這塊會導致問題,但是在計劃創建索引的列中,就應該盡量避免設計成null列,但值得一提的是在innodb中使用進行null列的存儲是使用單獨的位(bit)進行存儲null 的值,在大量出現null 的情況,有很好
的空間效率。但這點不適用于myisam。
?
下面進行進行數據類型
數字類型
整數類型
MySQL中有兩種數字類型:整數(whole number)和實數(real number)。如果存儲整數,可以使用以下的整數類型:
| ? | TINYINT | SMALLINT | MEDIUMINT | INT | BIGINT |
| 儲存空間(位) | 8 | 16 | 24 | 32 | 64 |
| 存儲值范圍 | -128~127 | -32768~32767 | -8388608~8388607 | -2147483648~2147483647 | -9223372036854775808~9223372036854775807 |
其中存儲值范圍計算公式為-2^(N-1)~2^(N-1)-1,其中N是存儲空間的位數。
其中整數類型可以選用UNSIGNED屬性,表示不允許為負值,這大致可以使得正數的上限提升一倍,比如TINYINT UNSIGNED 可以存儲的范圍是0~255,而TINYINT 的范圍是-128~127。
您的選擇將會決定mysql是怎樣在內存和磁盤保存數據的。然而整數類型的計算一般使用64位的BIGINT整數,即使在32位的環境也是如此。(一些聚合函數是例外,他們使用的是decimal或double進行計算)
mysql可以為整數類型指定寬度 ,例如INT(11),其實這里對于大多數應用是沒有意義的,他不會限制值的合法范圍,只是規定了mysql中的交互工具(例如mysql命令行客戶端)用來顯示字符的個數。對于存儲
和計算來說INT(1)和INT(10)的作用是相同的,這里很多的人都會誤解,包括我。
?
實數類型
首先實數類型就是帶有小數點的數據類型,在權威指南書中看來,mysql進行存儲實數類型的數據數據占用的空間比起整數類型要高的多,基本單位都是以字節為單位,而整數類型是以bit為單位1字節=8bit,
說說實數類型的特點,FLOAT、DOUBLE是依賴于所使用平臺的浮點數具體實現的,所以這種類型是不精確的,但由于是使用cpu直接進行的原聲浮點運算,所以浮點運算的速度明顯會更快,
而DECIMAL 是由mysql服務器自身實現的,其中它將數字列打包保存到了一個二進制字符串中(每4個字節存儲9個數字),例如DECIMAL(18,9)主要看9, 它是將小數點兩邊各存儲9個數字,小數點占用1個字節,
一共使用9個字節 ,小數點前后各使用4個字節,小數點一個字節。且DECIMAL也可以用來存儲比BIGINT范圍更大的數字。
實數類型包括了FLOAT、DOUBLE、DECIMAL
| ? | FLOAT | DOUBLE | DECIMAL |
| 存儲空間(字節) | 4 | 8 | 自己設定(最大支持65位數字) |
因為需要額外的空間和開銷,所以應該在只對小數進行精確計算的時候才使用DECIMAL ,例如存儲財務數據。但是在數據量比較大的時候,可以考慮使用BIGINT 進行代替DECIMAL ,將需要存儲的貨幣單位乘于相應的倍數,
假設要存儲的財務數據需要精確到萬分之一,則可以將所有金額乘于一百萬,然后將結果存儲到BIGINT中,這樣可以同時避免計算不精確和DECIMAL 精確計算代價高的問題。
?
字符類型
?
轉載于:https://www.cnblogs.com/gosimple/p/8012014.html
總結
以上是生活随笔為你收集整理的如何为MySQL选择更合适的数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux内核tracepoints
- 下一篇: E: Unable to lock th