char與varchar
??char:固定長度的字符型別,varchar屬于可變的字符型別,(那我們究竟選哪個,記住選擇varchar沒毛病!!!)
??為什么選擇varchar,總結為三點
- 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功能對這類表進行碎片整理,
演示如下

我們查看表的物理大小

這里資料檔案顯示為351.89MB,從表t1中洗掉id為“1”的資料
再查看表的大小


可以發現,表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功能對表進行碎片整理,
日期型別要根據實際需要選擇能夠滿足應用的最小存盤的日期型別,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/56225.html
標籤:MySQL
上一篇:mysql的CURRENT_TIMESTAMP【轉】
下一篇:MySQL中表的存盤引擎如何選擇
