mysql 数据类型的选择

3.1 选择数据类型的基本原则

前提: 使用适合存储引擎。
选择原则: 根据选定的 存储引擎 ,确定如何选择合适的数据类型
下面的选择方法按存储引擎分类:
1. MyISAM 数据存储引擎和数据列
MyISAM数据表,最好使用固定长度的数据列代替可变长度的数据列。
2. MEMORY存储引擎和数据列
MEMORY数据表目前都使用固定长度的数据行存储,因此无论使用CHAR或VARCHAR列都没
有关系。两者都是作为CHAR类型处理的。
3. InnoDB 存储引擎和数据列
建议使用 VARCHAR类型
对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行
都使用指向数据列值的头指针),因此在本质上,使用固定长度的 CHAR列不一定比使
用可变长度VARCHAR列简单。因而,主要的性能因素是数据行使用的存储总量。由于 CHAR
平均占用的空间多于VARCHAR,因 此使用VARCHAR来最小化需要处理的数据行的存储总
量和磁盘I/O是比较好的。
3.2 固定长度数据列与可变长度的数据列
3.2.1 3.2.1 3.2.1 3.2.1 char char char char与varchar varchar varchar varchar
� CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾
部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
www.163.com
网易技术部 14
下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和
VARCHAR之间的差别:
请注意上表中最后一行的值只适用 不使用严格模式 时;如果MySQL运行在严格模式,超过列
长度不的值 不 保存 ,并且会出现错误。
从CHAR(4)和VARCHAR(4)列检索的值并不总是相同,因为检索时从CHAR列删除了尾部的空
格。通过下面的例子说明该差别:
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
+----------------+----------------+
| CONCAT(v, '+') | CONCAT(c, '+') |
+----------------+----------------+
| ab + | ab+ |
+----------------+----------------+
1 row in set (0.00 sec)
值 CHAR(4) 存储需求 VARCHAR(4) 存储需求
'' ' ' 4个字节 '' 1个字节
'ab' 'ab ' 4个字节 'ab ' 3个字节
'abcd' 'abcd' 4个字节 'abcd' 5个字节
'abcdefgh' 'abcd' 4个字节 'abcd' 5个字节
www.163.com
网易技术部 15
3.2.2 3.2.2 3.2.2 3.2.2 text text text text和blob blob blob blob
在使用text和blob字段类型时要注意以下几点,以便更好的发挥数据库的性能.
1. BLOB和TEXT值也会引起自己的一些问题,特别是执行了大量的删除或更新操作的时候。
删除这种值会在数据表中留下很大的"空洞",以后填入这些"空洞"的记录可能长度不
同,为了提高性能,建议定期使用 OPTIMIZE TABLE 功能对这类表进行碎片整理.
2. 使用合成的(synthetic)索引。合成的索引列在某些时候是有用的。一种办法是根据
其它的列的内容建立一个散列值,并把这个值存储在单独的数据列中。接下来你就可以
通过检索散列值找到数据行了。但是,我们要注意这种技术只能用于精确匹配的查询(散
列值对于类似<或>=等范围搜索操作符 是没有用处的)。我们可以使用MD5()函数生成散
列值,也可以使用SHA1()或CRC32(),或者使用自己的应用程序逻辑来计算散列值。请
记住数值型散列值可以很高效率地存储。同样,如果散列算法生成的字符串带有尾部空
格,就不要把它们存储在CHAR或VARCHAR列中,它们会受到尾部空格去除的影响。
合成的散列索引对于那些BLOB或TEXT数据列特别有用。用散列标识符值查找的速度比搜
索BLOB列本身的速度快很多。
3. 在不必要的时候避免检索大型的BLOB或TEXT值。例如,SELECT *查询就不是很好的想
法,除非你能够确定作为约束条件的WHERE子句只会找到所需要的数据行。否则,你可
能毫无目的地在网络上传输大量的值。这也是 BLOB或TEXT标识符信息存储在合成的索
引列中对我们有所帮助的例子。你可以搜索索引列,决定那些需要的数据行,然后从合
格的数据行中检索BLOB或 TEXT值。
4. 把BLOB或TEXT列分离到单独的表中。在某些环境中,如果把这些数据列移动到第二张数
据表中,可以让你把原数据表中 的数据列转换为固定长度的数据行格式,那么它就是
有意义的。这会减少主表中的碎片,使你得到固定长度数据行的性能优势。它还使你在
主数据表上运行 SELECT *查询的时候不会通过网络传输大量的BLOB或TEXT值。
3.3 浮点数与定点数
为了能够引起大家的重视,在介绍浮点数与定点数以前先让大家看一个例子:
mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
Query OK, 0 rows affected (0.29 sec)
www.163.com
网易技术部 16
mysql> insert into test values(131072.32,131072.32);
Query OK, 1 row affected (0.07 sec)
mysql> select * from test;
+-----------+-----------+
| c1 | c2 |
+-----------+-----------+
| 131072.31 | 131072.32 |
+-----------+-----------+
1 row in set (0.00 sec)
从上面的例子中我们看到c1列的值由131072.32变成了131072.31,这就是浮点数的
不精确性造成的。
在mysql中float、double(或real)是浮点数,decimal(或numberic)是定点数。
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;
它的缺点是会引起精度问题。
在今后关于浮点数和定点数的应用中,大家要记住以下几点:
1、浮点数存在误差问题;
2、对货币等对精度敏感的数据,应该用定点数表示或存储;
3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
4、要注意浮点数中一些特殊值的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值