字节流的博客

MySQL 数据类型的选择

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
    8
    CREATE 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 能够和时区对应;
Thanks! 😊