第八章 选择合适的数据类型
CHAR与VARCHAR
CHAR:
- 固定长度,处理速度快
- 浪费空间
- 需要对行尾空格进行处理
应用场景:长度变化不大并且对查询速度有较高要求的数据
不同引擎下的选择
- MyISAM 存储引擎:建议使用CHAR
- MEMORY 存储引擎:皆可。两者都是作为 CHAR 类型处理
- InnoDB 存储引擎:建议使用 VARCHAR
TEXT与BLOB
注意:在执行了大量的删除操作时,删除操作会在数据表中留下很大的“空洞”。为了提高性能,建议定期使用 OPTIMIZE TABLE 功能对这类表进行碎片整理,避免因为“空洞”导致性能问题。
- 可以使用合成的(Synthetic)索引来提高大文本字段(BLOB 或TEXT)的查询性能。合成索引就是根据大文本字段的内容建立一个散列值,并把这个值存储在单独的数据列中,接下来就可以通过检索散列值找到数据行了。但是,要注意这种技术只能用于精确匹配的查询
- 在不必要的时候避免检索大型的 BLOB 或 TEXT 值。避免“SELECT *”的出现
- 把 BLOB 或 TEXT 列分离到单独的表中。
浮点数与定点数
区别:
- 当一个字段被定义为浮点类型后,如果插入数据的精度超过该列定义的实际精度,则插入值会被四舍五入到实际定义的精度值,然后插入,四舍五入的过程不会报错
- 定点数是以字符串形式存放的,可以更加精确的保存数据。如果实际插入的数值精度大于实际定义的精度,则 MySQL 会进行警告
原则:
- 浮点数存在误差问题
- 对货币等对精度敏感的数据,应该用定点数表示或存储
- 在编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较
- 要注意浮点数中一些特殊值的处理
日期类型选择
- 根据实际需要选择能够满足应用的最小存储的日期类型
- 如果要记录年月日时分秒,并且记录的年份比较久远,那么最好使用 DATETIME
- 如果记录的日期需要让不同时区的用户使用,那么最好使用 TIMESTAMP