MySQL选择合适的数据类型

一。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,由于日期类型中只有它可以和实际时区相对应。

相关文章
相关标签/搜索