Sql 对一组数据使用integer over varchar值*真的*值得吗?
例如,如果我有一个表用户,我想存储性别或性别,我将添加一列,如Sql 对一组数据使用integer over varchar值*真的*值得吗?,sql,database,optimization,Sql,Database,Optimization,例如,如果我有一个表用户,我想存储性别或性别,我将添加一列,如sex 使用一个整数然后用我最喜欢的编程语言映射它真的值得吗 像1=>“男性”和2=>“女性” 这样做有什么性能原因吗 或者我可以安全地使用varchar,它对“女性”或“男性”的意义更大,就像我使用mysqlENUM 编辑:我四处寻找,有时更好,有时无关紧要,所以我更多的是寻找基准或是一些“更好”的答案 我的意思是,我认为使用varchar实际上比使用整数更有意义,而且我只会在性能超过0.3%或更高的情况下使用整数。如果对其进行任何
sex
使用一个整数然后用我最喜欢的编程语言映射它真的值得吗
像1=>“男性”
和2=>“女性”
这样做有什么性能原因吗
或者我可以安全地使用varchar,它对“女性”或“男性”的意义更大,就像我使用mysqlENUM
编辑:我四处寻找,有时更好,有时无关紧要,所以我更多的是寻找基准或是一些“更好”的答案
我的意思是,我认为使用varchar实际上比使用整数更有意义,而且我只会在性能超过0.3%或更高的情况下使用整数。如果对其进行任何
选择,它将比进行字符串比较快得多
SELECT * FROM User WHERE Gender = 'female'
例如:
假设我有女性
作为字符串。它有6个字符长。因此,它必须对每条记录进行6次比较,这就是使用严格的大小写-不区分大小写的成本更高
现在假设我将123456
作为一个int。它是一个值,而不是要比较的6,即使人类可读的字符串是6个字符长
旁白
理想情况下,男性
和女性
将是另一个表,而您的用户
表将有一个FK指向该表。存储为varchar
的好处是,数据大部分可以为自己说话-但是,它到此结束,只在原始数据查询中显示自己,这通常是由了解系统的开发人员完成的(向用户或其他人公开数据查询功能通常会使用应用程序层,这意味着您可以根据需要对其进行格式化。)并且此数据可以显示,但是考虑一下不断地分析它!
至于存储为整数,它有点模糊,但只要在数据规范和映射中清楚地列出了它,那么您就可以在应用程序中更有效地使用数据(使用将整数
映射到枚举
是一件一次性的事情,可以在术语或分支逻辑中公开更可用的类型,从而删除字符串解析。)它也比存储字符串更有效
当然,在一个专用表中存储“选项”并让其他表字段引用它是有办法的,但我在许多项目中发现,这在利用率方面远远不够理想,除非仍然使用可映射类型,否则该表可能只会使事情变得更加模糊。基本答案:
我建议将其存储在CHAR(1)
列中,作为M
或F
它对于特定的目的具有足够的表达能力,并且具有作为单个字符比较的速度优势
更新4(固定基准):
所有以前的基准测试都有一个致命的缺陷,即一个(CHAR(1)
)表是MyISAM
,而所有其他表都是InnoDB
。因此,我使用MyISAM
用所有表重新创建了数据库,现在结果变得更有意义了
当我使用MySQLWorkbench的向导创建表时,错误悄悄地出现了,忘记更改其他表中的数据库引擎,它默认为InnoDB
(我有MySQL 5.5)
因此,更正后的结果如下(我删除了之前所有的基准,因为它们无效):
新结论:TINYINT
是最快的。但我的建议仍然是使用CHAR(1)
,因为未来的开发人员更容易理解数据库
如果您确实使用TINYINT
,我的建议是将列命名为ismale
,而不是sex
,并存储0=>女性
和1=>男性
,从而使其在原始数据库中更容易理解
基准的表格结构如下:
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个条目。整数比字符串比较快得多,但我认为最好使用字符'M'或'F'。如果人们转储表,他们会确切知道您的意图,这比维护联接表要好。除非我们很快就会遇到新的性别。这取决于一般来说是的
INT占用的磁盘空间更少
整数比较快
ints在网络上的传输速度更快(更小)
因此,如果它只有一行,并且你每天查询一次-你永远不会注意到,但一般来说,你会从中受益。如果这是针对某个自制网站或应用程序,它将为10人提供服务,那么你可以做任何你想做的事情,性能不会有什么不同
如果这是为了一些真实的东西,那么就不要在你自己的性别实施中使用。或者至少在任何地方都要遵守标准(谢谢Joe Celko!)
始终调整数据类型的大小
- 节省磁盘空间:
在我的上一份工作中,负责设计表的学究们创建了一个精度为0的十进制列,因为它应该只有N个数字。该列与整数数据类型之间的存储成本差异为1或2个字节。然而,由于该表非常大,使用较小的数据类型所节省的总成本在仅表上就有千兆字节
- 访问节省:
大多数人没有考虑的第二个成本是从磁盘读取信息或将数据保存在内存中的成本。在SQL Server中,数据存储在8K页中。如果使用fat数据类型,则需要更多的读取才能从磁盘中获取数据,然后可以在内存中存储更少的数据页。拉取数据
CHAR(1), VARCHAR(6), TINYINT
0 = not known
1 = male
2 = female
9 = not applicable