1、char与varchar
char固定长度的字符类型,处理速度比varchar快得多,但浪费存储空间,适合:长度变化不大并且对查询速度有较高要求的数据。
varchar可变长度的字符类型。
MyISAM:char
MEMORY:均作为char类型处理
InnoDB:varchar最小化需要处理的数据行的存储总量和磁盘I/O。InnoDB内部的行存储格式没有区分固定长度和可变长度列(所有数据行都指向数据列值的头指针),主要性能因素是数据行使用的存储总量。
2、text和blob
blob能用来保存2进制数据
text只能保存字符数据
(1)blob和text值,删除操作会在数据表中留下很大的“空洞”,以后填入这些“空洞”的记录在插入的性能上会有影响。所以建议使用OPTIMIZE TABLE 功能对表进行碎片整理,避免因为“空洞”导致性能问题。
(2)可以使用合成的(Synthetic)索引来提高文本字段(text、blob)的查询性能。
合成索引:根据大文本字段的内容简历一个散列值,并把这个值存储在单独的数据列中,接下来就可以通过检索散列值找到数据行了。
只能用于精确匹配的查询。可以用MD5()、SHA1()、CRC32()或自己的应用逻辑来计算散列值。数值型散列值可以很高效的存储。
(3)前缀索引:对blob或者clob字段进行模糊查询,只为字段的前n列创建索引。
(4)在不必要的时候避免检索大型的blob或者text值。
(5)把blob或者text列分离到单独的表中。
3、浮点数与定点数
浮点数:float、double,插入数据的精度超过该列定义的实际精度,则插入值会被四舍五入到实际定影的精度值。
定点数:decimal、numberuc。以字符串形式存放,插入数据的精度超过该列定义的实际精度,则默认SQLMode模式下会进行警告;TRADITIONAL传统模式下的SQLMode则系统直接报错,导致数据无法插入。
在精度要求比较高的应用中(比如货币)要使用定点数而不是浮点数来保存数据。
尽量避免浮点数的比较,非要用可以使用==比较。
浮点数存在误差。
注意浮点数中一些特殊值的处理
4、日期类型选择
(1)如果要记录年月日时分秒,并且记录的年份比较久远。最好用DATETIME,而不用TIMESTAMP。因为TIMESTAMP表示的日期范围要比DATETIME要短的多。
(2)如果记录的日期需要让不同时区的用户使用,那么最好使用TIMESTAMP。