MySQL 你可能忽视的选择问题( 三 )
在 MySQL 中,不同的存储引擎对 CHAR 和 VARCHAR 的使用原则也有不同
- MyISAM:建议使用固定长度的数据列替代可变长度的数据列,也就是 CHAR
- MEMORY:使用固定长度进行处理、CHAR 和 VARCHAR 都会被当作 CHAR 处理
- InnoDB:建议使用 VARCHAR 类型
- TEXT
- MEDIUMTEXT
- LONGTEXT
- BLOB
- MEDIUMBLOB
- LONGBLOB
TEXT 和 BLOB 在删除数据后会存在一些性能上的问题,为了提高性能,建议使用 OPTIMIZE TABLE 功能对表进行碎片整理 。
也可以使用合成索引来提高文本字段(BLOB 和 TEXT)的查询性能 。合成索引就是根据大文本(BLOB 和 TEXT)字段的内容建立一个散列值,把这个值存在对应列中,这样就能够根据散列值查找到对应的数据行 。一般使用散列算法比如 md5() 和 SHA1() ,如果散列算法生成的字符串带有尾部空格,就不要把它们存在 CHAR 和 VARCHAR 中,下面我们就来看一下这种使用方式
首先创建一张表,表中记录 blob 字段和 hash 值

文章插图
向 cxuan005 中插入数据,其中 hash 值作为 info 的散列值 。

文章插图
然后再插入两条数据

文章插图
插入一条 info 为 cxuan005 的数据

文章插图
如果想要查询 info 为 cxuan005 的数据,可以通过查询 hash 列来进行查询

文章插图
这是合成索引的例子,如果要对 BLOB 进行模糊查询的话,就要使用前缀索引 。
其他优化 BLOB 和 TEXT 的方式:
- 非必要的时候不要检索 BLOB 和 TEXT 索引
- 把 BLOB 或 TEXT 列分离到单独的表中 。
首先创建一个表 cxuan006 ,只为了测试浮点数问题,所以这里我们选择的数据类型是 float

文章插图
然后分别插入两条数据

文章插图
然后执行查询,可以看到查询出来的两条数据执行的舍入不同

文章插图
为了清晰的看清楚浮点数与定点数的精度问题,再来看一个例子

文章插图
先修改 cxuan006 的两个字段为相同的长度和小数位数
然后插入两条数据

文章插图
执行查询操作,可以发现,浮点数相较于定点数来说,会产生误差

文章插图
日期类型选择在 MySQL 中,用来表示日期类型的有 DATE、TIME、DATETIME、TIMESTAMP,在
138 张图带你 MySQL 入门
这篇文中介绍过了日期类型的区别,我们这里就不再阐述了 。下面主要介绍一下选择
- TIMESTAMP 和时区相关,更能反映当前时间,如果记录的日期需要让不同时区的人使用,最好使用 TIMESTAMP 。
- DATE 用于表示年月日,如果实际应用值需要保存年月日的话就可以使用 DATE 。
- TIME 用于表示时分秒,如果实际应用值需要保存时分秒的话就可以使用 TIME 。
- YEAR 用于表示年份,YEAR 有 2 位(最好使用4位)和 4 位格式的年 。默认是4位 。如果实际应用只保存年份,那么用 1 bytes 保存 YEAR 类型完全可以 。不但能够节约存储空间,还能提高表的操作效率 。
推荐阅读
- Nacos数据持久化到MySQL
- |看完这条,在职场中你会比其他人都走得远!
- 广州市|裁判,悠着点,您的红牌可能毁了一个中国球员的职业生涯
- 心理测试:2020年你的运势怎么样
- 心理测试:情人节表白你会成功吗
- 喝什么茶能养胃?转给胃不好的你
- 用茶叶做菜,你试过吗?香的直流口水!
- 茶是健康之饮 你不应该因失眠而拒绝茶
- 饵料|不是隔夜窝没用,而是你没打好!天气变热,这样打窝才有效!
- 喝酒礼仪你有注意到吗