char和varchar
: 一般情况下,由于char是固定长度的,所以它的处理速度比varchar要快的多,但是器缺点是浪费存储空间,程序需要对行尾空格进行处理,所以对于那些长度变化不大并且对查询速度有较高要求的诗句可以考虑使用char类型存储。Mysql中不同引擎对varchar和插入的使用原则:
Myisam:使用固定长度
Memory:不管设定是varchar还是char,最后都是char来处理。
Innodb: 使用varchar。Innodb内部没有区分两者的区别,所有的数据行都是使用指向数据列值的头指针。因此存储空间才是主要的问题,所以使用varchar更加省空间和减缓I/O。
text和blob:
两者都是用来存储大的字符串。text存储文本字符串,blob用于存储二进制的字符串,比如图片。blob和text引起的性能问题:特别是在大量执行删除操作时。
删除操作会在数据表中留下很大的"空洞",以后填写这些"空洞"的记录在插入性能上会有影响。事实上,删除操作,只是在表中清空了记录,但是数据库的存储文件依然没有变小。为了提示性能,要定期的使用OPTIMIZE TABLE 进行碎片整理。
使用合成的索引值,即利用某个column的md5等算法生成索引,提示大文本的查询速度
这种查询,只适用于精确的查询。
比如:使用cotent的md5值作为索引
create table t (id int(4), content text, hash_val varchar(40));
insert into t values(1,repeat('wxl',200),md5(content));
select * from t where hash_val=md5(repeat('wxl',200));
把大文本单独存在一张表里;
减少主表的碎片,可以使select * 这种操作返回更少的数据量,减少网络开销。
float和decimal:
用于存储带有小数的数据类型。浮点数存在误差的问题,四舍五入
与钱有关等对精度敏感的数据,应当使用定点数decimal来表示。
编程中也要考虑浮点数带来的问题。尽量避免做浮点数的比较
日期类型:date、time、datetime、timestamp
根据需求,选择占用空间最少的类型存储。
记录年月日时分秒且记录的年份比较久远,那么使用DATETIME,而不使用TIMESTAMP,因为TIMESTAMP能记录日期的日期范围比TIMESTAMP小。
如果记录时间要随着用户不同的时区做相应的变化时,选择TIMESTAMP