mysql应该根据那些原则来进行数据类型的选择!

1.char与varchar

CHAR 和 VARCHAR 类型类似,都用来存储字符串,但它们保存和检索的方式不同。

CHAR 属于固定长度的字符类型,而 VARCHAR 属于可变长度的字符类型。

有一点需要注意的就是超过列长度的值将不会被保存。

从 CHAR(4)和 VARCHAR(4)列检索的值并不总是相同,因为检索时从 CHAR 列删除了

尾部 的空格。下面通过一个例子说明该差别:

CREATE TABLE vc (v VARCHAR(4), c CHAR(4));

INSERT INTO vc VALUES ('ab ', 'ab ');

SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;

由于 CHAR 是固定长度的,所以它的处理速度比 VARCHAR 快得多,但是其缺点是浪费

存储空间,程序需要对行尾空格进行处理,所以对于那些长度变化不大并且对查询速度有

较 高要求的数据可以考虑使用 CHAR 类型来存储。

 

*在 MySQL 中,不同的存储引擎对 CHAR 和 VARCHAR 的使用原则有所不同,这里简单概 括如下。

 MyISAM 存储引擎:建议使用固定长度的数据列代替可变长度的数据列。

 MEMORY 存储引擎:目前都使用固定长度的数据行存储,因此无论使用 CHAR 或 VARCHAR 列

    都没有关系。两者都是作为 CHAR 类型处理。

 InnoDB 存储引擎:建议使用 VARCHAR 类型。对于 InnoDB 数据表,内部的行存储

格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因

此在 本质上,使用固定长度的 CHAR 列不一定比使用可变长度 VARCHAR 列性能要好。

因而,主 要的性能因素是数据行使用的存储总量。由于 CHAR 平均占用的空间多于

VARCHAR,因此使 用 VARCHAR 来最小化需要处理的数据行的存储总量和磁盘 I/O

是比较好的。

2.TEXT 与 BLOB

在保存少量的字符串使用char和varchar,但是在保存较大文本时,一般选择使用text和blob.

它们的主要区别在于blob能保存二进制数据,比如照片,text只能保存字符数据,

 BLOB 和 TEXT 值会引起一些性能问题,特别是在执行了大量的删除操作时。

删除操作会在数据表中留下很大的“空洞”,以后填入这些“空洞”的记录在插入的性能上面会有影响。

为了提高性能,建议定期使用OPTIMIZE TABLE 功能对这类表进行碎片整理,避 免因为“空洞”导致性能问题。

下面的例子描述了 OPTIMIZE TABLE 的碎片整理功能。

 可以使用合成的(Synthetic)索引来提高大文本字段(BLOB 或 TEXT)的查询性能。 简单来说,合成索引就是根据大文本字段的内容建立一个散列值,并把这个值存储在单独的 数据列中,接下来就可以通过检索散列值找到数据行了。但是,要注意这种技术只能用于精 确匹配的查询(散列值对于类似=等范围搜索操作符是没有用处的)。可以使用 MD5() 函数生成散列值,也可以使用 SHA1()或 CRC32(),或者使用自己的应用程序逻辑来计算散列 值。请记住数值型散列值可以很高效率地存储。同样,如果散列算法生成的字符串带有尾部 空格,就不要把它们存储在 CHAR 或 VARCHAR 列中,它们会受到尾部空格去除的影响。合 成的散列索引对于那些 BLOB 或 TEXT 数据列特别有用。用散列标识符值查找的速度比搜索 BLOB 列本身的速度快很多。

下面通过实例介绍一下合成索引的使用方法。

3 浮点数与定点数

浮点数:一般用于表示含有小数部分的数值。当一个字段被定义为浮点类型后,如果插入

数据的精度超过该列定义的实际精度,则插入值会被四舍五入到实际定义的精度值,然

后插 入,四舍五入的过程不会报错。在 MySQL 中 float、double(或 real)用来表示浮点数.

 

定点数:不同于浮点数,定点数实际上是以字符串形式存放的,所以定点数可以更加精确 的保存数据。

如果实际插入的数值精度大于实际定义的精度,则 MySQL 会进行警告(默认 的 SQLMode 下),但

是数据按照实际精度四舍五入后插入;如果 SQLMode 是在 TRADITIONAL (传统模式)下,则系统

会直接报错,导致数据无法插入。在 MySQL 中,decimal(或 numberic) 用来表示定点数。

4. 日期类型选择

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值