MySQL 你可能忽视的选择问题( 三 )


在 MySQL 中,不同的存储引擎对 CHAR 和 VARCHAR 的使用原则也有不同

  • MyISAM:建议使用固定长度的数据列替代可变长度的数据列,也就是 CHAR
  • MEMORY:使用固定长度进行处理、CHAR 和 VARCHAR 都会被当作 CHAR 处理
  • InnoDB:建议使用 VARCHAR 类型
TEXT 与 BLOB一般在保存较少的文本的时候,我们会选择 CHAR 和 VARCHAR,在保存大数据量的文本时,我们往往选择 TEXT 和 BLOB;TEXT 和 BLOB 的主要差别是 BLOB 能够保存二进制数据;而 TEXT 只能保存字符数据,TEXT 往下细分有
  • TEXT
  • MEDIUMTEXT
  • LONGTEXT
BLOB 往下细分有
  • BLOB
  • MEDIUMBLOB
  • LONGBLOB
三种,它们最主要的区别就是存储文本长度不同和存储字节不同,用户应该根据实际情况选择满足需求的最小存储类型,下面主要对 BLOB 和 TEXT 存在一些问题进行介绍
TEXT 和 BLOB 在删除数据后会存在一些性能上的问题,为了提高性能,建议使用 OPTIMIZE TABLE 功能对表进行碎片整理 。
也可以使用合成索引来提高文本字段(BLOB 和 TEXT)的查询性能 。合成索引就是根据大文本(BLOB 和 TEXT)字段的内容建立一个散列值,把这个值存在对应列中,这样就能够根据散列值查找到对应的数据行 。一般使用散列算法比如 md5() 和 SHA1() ,如果散列算法生成的字符串带有尾部空格,就不要把它们存在 CHAR 和 VARCHAR 中,下面我们就来看一下这种使用方式
首先创建一张表,表中记录 blob 字段和 hash 值
MySQL 你可能忽视的选择问题

文章插图
 
向 cxuan005 中插入数据,其中 hash 值作为 info 的散列值 。
MySQL 你可能忽视的选择问题

文章插图
 
然后再插入两条数据
MySQL 你可能忽视的选择问题

文章插图
 
插入一条 info 为 cxuan005 的数据
MySQL 你可能忽视的选择问题

文章插图
 
如果想要查询 info 为 cxuan005 的数据,可以通过查询 hash 列来进行查询
MySQL 你可能忽视的选择问题

文章插图
 
这是合成索引的例子,如果要对 BLOB 进行模糊查询的话,就要使用前缀索引 。
其他优化 BLOB 和 TEXT 的方式:
  • 非必要的时候不要检索 BLOB 和 TEXT 索引
  • 把 BLOB 或 TEXT 列分离到单独的表中 。
浮点数和定点数的选择浮点数指的就是含有小数的值,浮点数插入到指定列中超过指定精度后,浮点数会四舍五入,MySQL 中的浮点数指的就是 float 和 double,定点数指的是 decimal,定点数能够更加精确的保存和显示数据 。下面通过一个示例讲解一下浮点数精确性问题
首先创建一个表 cxuan006 ,只为了测试浮点数问题,所以这里我们选择的数据类型是 float
MySQL 你可能忽视的选择问题

文章插图
 
然后分别插入两条数据
MySQL 你可能忽视的选择问题

文章插图
 
然后执行查询,可以看到查询出来的两条数据执行的舍入不同
MySQL 你可能忽视的选择问题

文章插图
 
为了清晰的看清楚浮点数与定点数的精度问题,再来看一个例子
MySQL 你可能忽视的选择问题

文章插图
 
先修改 cxuan006 的两个字段为相同的长度和小数位数
然后插入两条数据
MySQL 你可能忽视的选择问题

文章插图
 
执行查询操作,可以发现,浮点数相较于定点数来说,会产生误差
MySQL 你可能忽视的选择问题

文章插图
 
日期类型选择在 MySQL 中,用来表示日期类型的有 DATE、TIME、DATETIME、TIMESTAMP,在
138 张图带你 MySQL 入门
这篇文中介绍过了日期类型的区别,我们这里就不再阐述了 。下面主要介绍一下选择