MySQL建表時如何選中合適的數據類型

char與varchar

🍓char:固定長度的字符類型。varchar屬於可變的字符類型。(那咱們究竟選哪一個,記住選擇varchar沒毛病!!!)mysql

🍓爲何選擇varchar,總結爲三點sql

  •    char處理速度快,但檢索時char列時,會刪除尾部的的空格,部分數據丟失的風險咱們不想承擔。
  •    MySQL5.5後咱們默認存儲引擎爲InnoDB,它對長度是否固定沒有區分。主要性能取決於數據行的存儲量,咱們的可變長度的存儲空間確定是最小的。
  •    varchar隨着MySQL版本的不斷升性能不斷提高,除非程序對查詢速度要求很高,或字段長度變化不大能夠考慮char.

char與varchar的區別以下編程

在MySQL中,不一樣的存儲引擎對CHAR和VARCHAR的使用原則有所不一樣,這裏簡單歸納以下。
MyISAM存儲引擎:建議使用固定長度的數據列代替可變長度的數據列。
MEMORY 存儲引擎:目前都使用固定長度的數據行存儲,所以不管使用 CHAR 或VARCHAR列都沒有關係。二者都是做爲CHAR類型處理。
InnoDB存儲引擎:建議使用VARCHAR類型。對於InnoDB數據表,內部的行存儲格式沒有區分固定長度和可變長度列(全部數據行都使用指向數據列值的頭指針),所以在本質上,使用固定長度的CHAR列不必定比使用可變長度VARCHAR列性能要好。於是,主要的性能因素是數據行使用的存儲總量。因爲CHAR平均佔用的空間多於VARCHAR,所以使用VARCHAR來最小化須要處理的數據行的存儲總量和磁盤I/O是比較好的。網絡

 

text與blob

🍓保存少許字符串時,咱們會選擇char或者varchar.在保存較大文本時,一般選擇使用text或者blob。性能

🍓text與blob的區別優化

  • blob能夠保存二進制數據,好比照片,text只能保存字符數據,如一篇文章或者日誌。

🍓text和blob執行大量刪除操做後,在數據表中留下大量「空洞」。爲提升性能咱們可按期使用optimize table功能對這類表進行碎片整理。ui

演示以下lua

咱們查看錶的物理大小spa

 

 這裏數據文件顯示爲351.89MB。從表t1中刪除id爲「1」的數據3d

再查看錶的大小

 

 

 

能夠發現,表t1的數據文件仍然爲351.89MB,並無由於數據刪除而減小。接下來對錶進行OPTIMIZE(優化)操做:

這裏mysql給的提示是Note>> Table does not support optimize, doing recreate + analyze instead
Status>> OK
也就是說 optimize table 對於innodb來講,沒法做爲a single operation.以上無效。
MySQL5.7已經推薦對於InnoDB的table使用 alter table table_name engine=innodb;語句的方式來進行表碎片優化。

 finish!

🍓可使用合成的(Synthetic)索引來提升大文本字段(BLOB或TEXT)的查詢性能。要注意這種技術只能用於精確匹配的查詢.

🍓在沒必要要的時候避免檢索大型的BLOB或TEXT值。

例如,SELECT *查詢就不是很好的想法,除非可以肯定做爲約束條件的WHERE子句只會找到所須要的數據行。不然,極可能毫無目的地在網絡上傳輸大量的值。這也是 BLOB 或TEXT標識符信息存儲在合成的索引列中對用戶有所幫助的例子。用戶能夠搜索索引列,決定須要的哪些數據行,而後從符合條件的數據行中檢索BLOB或TEXT值。

🍓把BLOB或TEXT列分離到單獨的表中。
在某些環境中,若是把這些數據列移動到第二張數據表中,能夠把原數據表中的數據列轉換爲固定長度的數據行格式,那麼它就是有意義的。這會減小主表中的碎片,能夠獲得固定長度數據行的性能優點。它還可使主數據表在運行 SELECT *查詢的時候不會經過網絡傳輸大量的BLOB或TEXT值。

 浮點數與定點數

🍓浮點數(float,double)定點數(decimal,numberic)

🍓定點數不一樣於浮點數,定點數其實是以字符串形式存放的,因此定點數能夠更精確的保存數據。

 

🍓浮點數的精度問題。

在選擇浮點型數據保存小數時,要注意四捨五入的問題,並儘可能保留足夠的小數位,避免存儲的數據不許確。

點數的比較也是一個廣泛存在的問題,下面的程序片段中對兩個浮點數作減法運算:

 

public class Test {
 public static void main(String[] args) throws Exception {
  System.out.print("7.22-7.0=" + (7.22f-7.0f));
 }
 }

 

 

 

 對上面Java程序的輸出結果可能會想固然地認爲是0.22,可是,實際結果倒是7.22-7.0=0.21999979,所以,在編程中應儘可能避免浮點數的比較,若是非要使用浮點數的比較則最好使用範圍比較而不要使用「==」比較。

下面使用定點數來實現上面的例子

 

 

 

 

 注意:在從此關於浮點數和定點數的應用中,用戶要考慮到如下幾個原則:
浮點數存在偏差問題;
對貨幣等對精度敏感的數據,應該用定點數表示或存儲;
在編程中,若是用到浮點數,要特別注意偏差問題,並儘可能避免作浮點數比較;
要注意浮點數中一些特殊值的處理。

 日期類型的選擇

🍓日期類型包括:DATE \TIME\TIMESTAMP\DETATIME.

🍓根據實際須要選擇知足應用最小的存儲的日期類型。

  • 若是應用只須要記錄「年份」,那麼用1個字節來存儲的YEAR類型徹底能夠知足,而不須要用4個字節來存儲的DATE類型。這樣不只僅能節約存儲,更可以提升表的操做效率。
  • 若是要記錄年月日時分秒,而且記錄的年份比較久遠,那麼最好使用 DATETIME,而不要使用TIMESTAMP。由於TIMESTAMP表示的日期範圍比DATETIME要短得多。
  • 若是記錄的日期須要讓不一樣時區的用戶使用,那麼最好使用TIMESTAMP,由於日期類型中只有它可以和實際時區相對應。

小結

對於字符類型,要根據存儲引擎來進行相應的選擇。
對精度要求較高的應用中,建議使用定點數來存儲數值,以保證結果的準確性。
對含有 TEXT 和 BLOB 字段的表,若是常常作刪除和修改記錄的操做要定時執行OPTIMIZE TABLE功能對錶進行碎片整理。
日期類型要根據實際須要選擇可以知足應用的最小存儲的日期類型。

相關文章
相關標籤/搜索