MySQL的数据类型可以分为数值型、字符串类型、日期和时间类型。
一些主要的数据类型之间的比较:
char 与 varchar
- char在读取时会删除了尾部的空格。
- char是固定长度而varchar是变长,所以char效率会高一些,但是随着MySQL版本的不断升级,varcahr性能也在不断的提高,所以在现在很多项目中,varchar更多的被使用。
- MyISAM存储引擎建议使用固定长度的数据列代替可变长度的数据列;
- MEMORY存储引擎目前都使用固定长度的数据行存储,因此无论使用CHAR或VARCHAR列都没有关系。两者都是作为CHAR类型处理。
- InnoDB存储引擎建议使用varchar类型。对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度(所有的数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的char不一定比使用可变长度varchar列性能好。因而,主要的性能因素是数据行使用的存储总量。由于char平均占用的空间多有varchar,因此使用varchar来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。
text 与 blob
- blob和text值会引起一些性能问题,特别是在执行了大量的删除操作时,删除操作会在数据表中留下很大的“空洞”,以后填入这些“空洞”的记录在插入的性能上会有影响,为了提高性能,建议定期使用OPTIMIZE TABLE功能对这类表进行碎片化整理,避免因为“空洞”导致性能问题。可以通过尝试构建一个表,然后插入大量的blob和text类型的数据,然后删除,查看.frm .MYD .MYI文件的大小,然后通过OPTIMIZE TABLE优化后再查看.frm .MYD .MYI文件的大小,观察这中间的变化。
- 合成索引来提高大文本字段(blob或text)的查询性能。
- 在不必要的时候避免检索大型的blob或text值。
- 把blob或text列分离到单独的表中
浮点数 与 定点数
日期类型选择
根据实际需要选择能够满足应用的最小存储的日期类型。
记录年月日时分秒,并且记录的年份比较久远,那么最好使用DATETIME,而不要使用TIMESTAMP。因为TIMESTAMP表示的日期范围比DATETIME要短得多。
如果记录的日期需要让不同时区的用户使用,那么最好使用TIMESTAMP,因为日期类型只有它能够和实际的时区对应。