1. CHAR && VARCHAR
由于CHAR的长度是固定的,VARCHAR长度不固定,所以CHAR的查询效率较高,但是浪费存储空间, 程序须对行尾空格进行处理。
mysql中不同的存储引擎对CHAR和VARCHAR使用原则不同,简单描述如下:
- MyISAM: 建议使用CHAR替代VARCHAR;
- MEMORY: CHAR和VARCHAR无所谓,因为内部 都按CHAR处理;
- InnoDB: 建议使用VARCHAR类型. 对于InnoDB数据表,内部的存储格式没有区分固定长度和可变长度列,因此本质上来说使用CHAR并不一定要比使用VARCHAR的性能要好。
2. TEXT && BLOB
CHAR和VARCHAR存储少量字符串,用TEXT或BLOB存储大量字符串,如文章。
二者区别是: TEXT只能存储文本;BLOB不仅可以存储文本,还可以存储二进制数据,如图片。
- TEXT 和 BLOB 值会引起一些性能问题,特别是在执行大量删除操作以后,在数据表中留下很大的
空洞
,为了提高性能,建议定期使用optimize table table_name
InnoDB不支持optimize,MyISAM支持; - 使用合成索引提高BLOB和TEXT的查询性能.只能用于精确查找;
示例代码:
1
2
3
4
5
6
7
8CREATE TABLE test(
id VARCHAR(100),
conTEXT BLOB,
hash_value VARCHAR(40)
);
--插入数据
INSERT INTO test VALUES('1', REPEAT('beijingbeijing', 100), MD5(conTEXT));在不必要的时候避免检索大型的 BLOB 和 TEXT 字段;
- 把 BLOB 和 TEXT 列分离到单独的表中;
3. 浮点数和定点数
- 浮点数存在误差问题;
- 对于货币等比较敏感的数据,应该采用定点数表示或存储;
- 在编程中,如果用到定点数,要特别注意误差的问题,尽量避免对浮点数进行比较;
- 要注意浮点数中一些特殊值的处理;
4. 日期类型
- 根据实际需求选择相应表示日期的数据类型;
- 如果要存放年份比较久远的日期,最好使用 DateTime,而不是 TimeStamp,因为 DateTime 范围比较大;
- 只有 TimeStamp 能够和时区对应;