一。char和varchar算法
char是固定長度的,查詢速度比varchar速度快的多。char的缺點是浪費存儲空間。sql
檢索char列時,返回的結果會刪除尾部空格,因此程序須要對爲空格進行處理。數據庫
對於長度變化不大且對查詢速度有較高要求的數據能夠考慮使用char。編程
隨着MySQL的不斷升級,varchar的性能不斷改進並提升。編程語言
存儲引擎使用原則:函數
MyISAM:建議使用固定長度列代替可變長度列。性能
InnoDB:建議使用varchar類型優化
二。text和blobspa
在保存大文本時,一般選擇text或者blob。3d
兩者的差異是blob能夠保存二進制數據,好比照片。
text和blob又包括text、mediumtext、longtext和blob、mediumblob、longblob,他們之間的區別是存儲文本長度不一樣和存儲字節不一樣。
應根據狀況選擇知足需求的最小存儲類型。
1.blob和text執行大量刪除操做時,產生數據「空洞」
刪除id爲7記錄先後數據庫所佔內存,沒有發生變化。
能夠發現數據文件並無由於數據刪除而減小。
對錶進行optimize(優化)操做:
optimize table t1;
能夠發現表數據文件大大縮小,「空洞」空間已經被回收。
2.用合成(Synthetic)索引提升查詢性能
根據大文本字段(text、blob)的內容創建一個散列值,並把這個值存儲在單獨的數據列中,而後經過散列值找數據行。
缺點:只能進行精確查詢(<、>=範圍操做符是沒有用處的)
能夠經過MySQL自帶函數md5()、sha1()、crc32()生成散列值,也能夠經過編程語言計算散列值。
注:若是散列算法生成的字符串帶有尾部空格,不要把他們存儲在char、varchar列中,他們會受到尾部空格去除的影響。
若是須要對blob或clob字段進行模糊查詢,能夠用前綴索引:
#前綴索引:對context字段的前100個字符建立索引 create index idx_blob on t2(context(100)); #查詢方法 select * from t2 where context like 'drake%';
注:%不能放在最前面
合成索引只能用於精確匹配,在必定程度上減小了I/O,從而提升了查詢效率。
3.在沒必要要的時候避免檢索大型的blob或text值。
4.把blob或text列分離到單獨的表中。
3、浮點數和定點數
1.浮點數存在偏差問題。
2.對貨幣等對精度敏感的數據,應該用定點數表示或存儲。
3.在編程中,若是用到浮點數,要特別注意偏差問題,並儘可能避免作浮點數比較。
4.要注意一些特殊值的處理。
4、日期類型的選擇
1.根據實際須要選擇可以知足應用的最小存儲日期類型。
2.若是記錄年月日時分秒,而且記錄年份比較久遠,最好使用datetime,不要使用timestamp。
3.若是記錄的日期須要讓不一樣時區的用戶使用,最好使用timestamp,由於日期類型中只有它可以和實際時區相對應。