MySQL選擇合適的數據類型


一。char和varchar

char是固定長度的,查詢速度比varchar速度快的多。char的缺點是浪費存儲空間

檢索char列時,返回的結果會刪除尾部空格,所以程序需要對為空格進行處理。

對於長度變化不大且對查詢速度有較高要求的數據可以考慮使用char。

隨着MySQL的不斷升級,varchar的性能不斷改進並提高

存儲引擎使用原則:

MyISAM:建議使用固定長度列代替可變長度列。

InnoDB:建議使用varchar類型

二。text和blob

在保存大文本時,通常選擇text或者blob。

二者的差別是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列分離到單獨的表中。

 

三、浮點數和定點數

1.浮點數存在誤差問題。

2.對貨幣等對精度敏感的數據,應該用定點數表示或存儲。

3.在編程中,如果用到浮點數,要特別注意誤差問題,並盡量避免做浮點數比較。

4.要注意一些特殊值的處理。

四、日期類型的選擇

1.根據實際需要選擇能夠滿足應用的最小存儲日期類型。

2.如果記錄年月日時分秒,並且記錄年份比較久遠,最好使用datetime,不要使用timestamp。

3.如果記錄的日期需要讓不同時區的用戶使用,最好使用timestamp,因為日期類型中只有它能夠和實際時區相對應。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM