我想用四分之一的静态字符串标记我的用户:坚不可摧,不可阻挡,超级和 megafantastic 。
存储字符串的一个char表示而不是整个字符串会更快更有效吗?类似于键< - >值映射。当我进行搜索时,DB只需要匹配一个字母而不是整个字符串。
在数据库中,这些单词只能表示为 i,u,s 和 m 。在用户个人资料中,如果我得到我,不可阻挡,如果我得到你等,则打印无法识别 < / p>
我是否真的通过这样做来加速任何事情,还是仅仅是不必要的工作? 如果我还有10个这样的表示怎么办?
答案 0 :(得分:6)
如果您在谈论数据库设计,则应该有normalized design。
创建查找表id / name,将id值存储在用户表中(使用类似tinyint的东西)。
ID Name
1 indestructible
2 unstoppable
3 superefficient
4 megafantastic
这样您就可以直接查询数据库中的字符串。
如果你缓存这个表,你就不会在数据库中找到这些值,而且你只会为每个用户存储少量数据(更不用说通过网络传输更少的数据) - 这些都转化为更好的数据库上的性能。
答案 1 :(得分:2)
当然,你可能会看到一点性能提升。也就是说,如果您破坏数据库设计,可能不值得。这是一个normalization问题。在不知道您计划如何使用数据的情况下,很难确切地说出您应该如何构建数据。
答案 2 :(得分:2)
我认为这是浪费时间。小心微优化。对于这样的减少,你将失去该列的数据库中的所有含义,失去了以相同字母开头的值的灵活性,必须修改你的DAL以在给出整个单词时仅传入第一个字母。
我通常会将列编入索引并将其保留为完整字符串。如果这是你系统中的瓶颈,那么你写下世界上最快,最有效的程序,你也不需要我的谦卑建议; - )。
答案 3 :(得分:1)
是的,这应该使您的代码更快,使用代码1,2,3,4甚至可以更快出于两个原因
1)比较一个int(可以在1个CPU周期中进行比较)比比较两个字符串花费的时间更少。即使是1个字符也可能需要更多周期,因为如果“A”等于“a”等,它需要工作。
2)它在表中占用的空间更少,在数据库中,行越小,数据库的速度就越快,因为SQL可以在页面上容纳更多的行。
您可能需要让大量用户注意到这些差异,但是保留代码而非值存储是一种很好的做法。
关心GJ
答案 4 :(得分:0)
您可以创建一个查找表,其中fk进入主表
Character
------------
CharacterID
Name
ProfileID int (FK)
Profile
--------
ProfileID
ProfileDesc
其中个人资料表是
ProfileID, ProfileDesc
----------------------
1 , indestructable
2 , ...
这将允许您在Character表
中的ProfileID上添加更小的更高效索引答案 5 :(得分:0)
如果您希望最大限度地提高性能并且不关心规范化这些数据(这几乎总是最佳选择),您可以将这4个属性存储为位:
CREATE TABLE <name> (
<other fields>
isIndestructible bit,
isUnstoppable bit
isSuperefficient bit
isMegafantastic bit
)
如果您决定添加“isMagnificent”或将“isIndestructable”更改为“isResilient”,那么您将成为SOL是不好的做法,但如果您真的只有4个要跟踪的属性,则4位很难击败。