char 与 varchar
char 属于固定长度的字符类型,而 varchar 属于可变长度的字符类型
检索时 char 会删除尾部的空格
-
不同存储引擎使用建议
MyISAM:char
MEMORY:char
InnoDB:varchar
text 与 blob
二者的主要差别是 blob 能用来保存二进制数据,而 text 只能保存字符数据
-
blob 和 text 值会引起一些性能问题,特别是在执行了大量的删除操作时
删除操作会在数据表中留下很大的空洞,以后填入这些空洞的记录在插入的性能上会有影响。微了提高性能,建议定期使用
optimize table
功能对这类表进行碎片整理,避免因为空洞导致性能问题 -
可以使用合成的(Synthetic)索引来提高大文本字段的查询性能
合成索引就是根据大文本字段的内容建立一个散列值,并把这个值存储在单独的数据列中,接下来就可以通过检索散列值找到数据行了。但是,要注意这种技术只能用于精确匹配的查询。可以使用
md5()
,sha1()
,或crc32()
函数生成散列值 在不必要的时候避免检索大型的 blob 或 text 值
把 blob 或 text 分离到单独的表中
浮点数和定点数
- 浮点数一般用于表示含有小数点的数值。当一个字段被定义为浮点类型后,如果插入数据的精度超过该列定义的实际精度,则插入值会被四舍五入到实际定义的精度值
- 定点数是以字符串形式存放的,所以定点数可以更精确的保存数据
- 浮点数会产生误差,避免与浮点数的比较
日期类型选择
- 根据实际需要选择能够满足应用的最小存储的日期类型
- 如果要记录年月日时分秒,并且记录的年份比较久远,那么最好使用 datetime,而不要使用 timestamp。因为 timestamp 表示的日期范围比 datetime 要短的多
- 如果记录的日期需要让不同时区的用户使用,那么最好使用 timestamp,因为日期类型中只有它能够和实际的时区相对应