对于一组数据,使用整数优于varchar是否真的值得?

时间:2011-09-24 12:28:28

标签: sql database optimization

例如,如果我有一个用户表,我想存储性别或性别,我会添加一个像sex这样的列。

使用整数然后用我最喜欢的编程语言映射它真的值得吗?

1 => 'Male'2 => 'Female'

有任何表演理由吗?

或者我可以安全地使用varchar, more 与'female'或'male'的含义几乎就像我使用mysql ENUM一样?

编辑:我在这里和那里有时候会更好,有时候没关系,所以我更多地寻找基准或某种“更好”的答案。

我的意思是我认为使用varchar实际上比整数更有意义,并且只有当性能超过0.3%或者其它时我才会使用整数。

7 个答案:

答案 0 :(得分:18)

答案 1 :(得分:7)

Ortiginal答案:
我建议将其存储在CHAR(1)MF中 它具有足够的表现力以达到特定目的,并且具有单个字符比较的速度优势

更新4(固定基准):
所有以前的基准测试都存在致命缺陷,其中一个(CHAR(1))表格为MyISAM,其他所有基准为InnoDB。所以我使用MyISAM重新创建了包含所有表的数据库,现在结果更有意义。

因为我使用MySQLWorkbench的向导来创建表而忘记更改其他表中的数据库引擎并且默认为InnoDB(我有MySQL 5.5)

所以更正的结果如下,(我已删除了之前的所有基准,因为它们无效):

// select queries
$query['char'] = "select count(*) from test_table where gender = 'M'";
$query['char_lower'] = "select count(*) from test_table where LOWER(gender) = 'm'";
$query['varchar'] = "select count(*) from test_table_2 where gender = 'Male'";
$query['varchar_lower'] = "select count(*) from test_table_2 where LOWER(gender) = 'male'";
$query['tinyint'] = "select count(*) from test_table_3 where gender = 1";

// benchmark result
array
  'char' => float 0.35457420349121
  'char_lower' => float 0.44702696800232
  'varchar' => float 0.50844311714172
  'varchar_lower' => float 0.64412498474121
  'tinyint' => float 0.26296806335449

新结论: TINYINT最快。但我的建议仍然是使用CHAR(1),因为未来的开发人员更容易理解数据库。

如果您使用TINYINT,我的建议是将列命名为ismale而不是sex并存储0 => Female1 => male,从而使其成为一点点在原始数据库中更容易理解。

基准的表结构是:

CREATE TABLE `test_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `gender` char(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM

3个表中只有性别列的类型不同,类型为:

CHAR(1), VARCHAR(6), TINYINT

所有3个表都有10000个条目。

答案 2 :(得分:3)

如果您正在进行任何SELECTS,它将比进行字符串比较快得多。

SELECT * FROM User WHERE Gender = 'female'

示例:

说我有female作为字符串。它长6个字符。因此,它必须对每个记录进行6次比较,并且使用严格的套管 - 对不区分大小写的代价更高。

现在说我有123456作为int。它的一个值,而不是6个比较,即使人类可读的字符串长度为6个字符。

除了

理想情况下,MaleFemale将是另一个表,而您的User表将具有该表的FK。

答案 3 :(得分:3)

存储为varchar的好处是数据本身可以说明一切 - 然而,它在那里结束并且仅在对原始数据的查询中表现出来,这通常由知道系统的开发人员完成。无论如何(向用户或其他人公开数据查询功能通常会使用应用程序层,这意味着可以根据需要格式化它。)并且这些数据可以显示,但考虑必须不断解析它!

至于存储为整数,它有点混淆,但只要它在数据规范和映射中清楚地列出,那么你就可以在应用程序中更有效地使用数据(使用映射将integer映射到enum是一件事情,并在术语或分支逻辑中公开更可用的类型,删除字符串解析。)它也比存储字符串更有效。

当然存在将'选项'存储在专用表中并且其他表字段引用它的路径,但我在许多项目中发现的是,这在使用方面远非理想,除非仍然使用可映射的类型 - 然后该表只会使某些东西更加模糊,可能。

答案 4 :(得分:3)

整数比进行字符串比较快得多,但我认为你更喜欢使用字符“M”或“F”。如果人们转移表,他们就会确切地知道你的意图,并且比维护连接表更好。除非我们很快就会遇到新的性别。

答案 5 :(得分:2)

取决于......但一般都是。

ints在磁盘上占用的空间更少。

整理比较快

ints通过网络更快(更小)

所以,如果它只是一行,而你每天查询一次 - 你永远不会注意到,但总的来说,你会受益。

答案 6 :(得分:2)

这很简单:使用ISO 5218值。为什么重新发明轮子并使您的区域设置特定且不太便携?

因为这组值很小且很稳定,所以你可以使用CHECK约束...... oops,我的意思是,MySQL用外键创建一个查找表!