假设我有“Win”,“Lose”,“Incomplete”,“Forfeit”等文本。我可以直接将文本存储在数据库中。相反,如果使用诸如0 = Win,1 = Lose等数字,我会在数据库性能方面获得实质性改进吗?特别是在字段是我的WHERE子句
的一部分的查询中答案 0 :(得分:5)
在CPU级别,比较两个固定大小的整数只需要一条指令,而比较可变长度字符串通常涉及循环遍历每个字符。因此,对于非常大的数据集,使用整数应该会有显着的性能提升。
此外,固定大小的整数通常会占用更少的空间,并且可以允许数据库引擎基于随机搜索执行更快的算法。
然而,大多数数据库系统都有enum
类型,适用于像您这样的情况 - 在查询中,您可以将字段值与固定的文字集进行比较,同时将其内部存储为整数。
答案 1 :(得分:2)
如果在索引中使用该列,可能会有显着的性能提升。
答案 2 :(得分:2)
根据表大小,枚举的可能值的数量以及数据库引擎/配置,它可以在从可忽略不计到极其有益的范围内。
也就是说,使用数字表示枚举类型几乎肯定会更糟糕。
答案 3 :(得分:1)
不要猜。测量
性能取决于索引的选择性(其中有多少个不同的值),自然键中是否有关键信息,自然键有多长,等等。您确实需要使用代表性数据进行测试。
当我为我的雇主的运营数据存储设计数据库时,我构建了一个测试平台,其中包含围绕自然键设计的表格以及围绕id编号设计的表格。这两种模式都有超过1300万行计算机生成的样本数据。在少数情况下,对id号架构的查询优于自然键架构50%。 (因此,使用自然密钥,使用id号花费20秒的复杂查询需要30秒。)但是,80%的测试查询对自然密钥模式具有更快的SELECT性能。有时它的速度要快得多 - 相差30到1。
当然,原因在于自然密钥模式上的大量查询根本不需要连接 - 最常用的信息自然地在自然密钥中携带。 (我知道这听起来很奇怪,但经常会出现这种情况。通常可能依赖于应用程序。)但是,零连接通常会比三连接快,即使你加入整数。 / p>
答案 4 :(得分:0)
显然,如果您的数据结构更短,它们的比较速度更快,存储和检索速度更快。
快一1,2,1000。这完全取决于桌子的大小等等。
例如:假设您有一个包含productId和varchar文本列的表。
每行大约需要4个字节用于int
,然后另一个3->示例中文本的24个字节(取决于列是否可为空或是unicode)
将具有byte
状态列的相同数据与每行5个字节进行比较。
这种巨大的空间节省意味着更多行适合页面,更多数据适合缓存,加载存储数据时发生的写入更少,等等。
此外,在最佳情况下比较字符串与比较字节和最差情况下的速度要慢得多。
将文本存储在您想要枚举的地方存在第二个大问题。当人们开始存储Incompete
而不是Incomplete
时会发生什么?
答案 5 :(得分:0)
拥有一个skinner列意味着每页可以容纳更多行。
varchar(20)和整数之间存在巨大差异。