我对SQL很陌生,我有一个关于性能的基本问题。
我希望创建一个用户数据库,该数据库将存储有关我的用户的信息:
稍后,我想对: Id、登录名和实名执行SELECT查询。
该数据库的最佳设计是什么,应该创建哪些表和键?
发布于 2012-01-04 06:58:05
如果只有这4个字段,它看起来就像一个表。ID上的主键,LoginName上的唯一索引。您可能不想存储密码,但只想存储散列。
根据查询的不同,创建不同的索引。此外,您可能根本不需要ID字段。
更新:在特定列上创建索引的使数据库能够优化其SQL语句。给定您的用户表:
USER
USER_ID BIGINT NOT NULL
LOGIN_ID VARCHAR(<size>) NOT NULL
PASSWORD VARCHAR(<size>) NOT NULL
NAME VARCHAR(<size>) NOT NULL
CONSTRAINT PK_USER PRIMARY KEY ( USER_ID )我知道的数据库将自动在主键上创建索引,这实际上意味着数据库维护一个优化的查找表,请参阅WikiPedia获取更多详细信息。
现在假设您希望通过LOGIN_ID查询用户,这是一个相当常见的用例,我想您可以创建另一个索引,如:
CREATE INDEX I_USER_1 ON USER ( LOGIN_ID asc )上述索引将优化select * from USER where LOGIN_ID='foo'。此外,您可以创建一个唯一的索引,前提是您不希望复制LOGIN_ID:
CREATE UNIQUE INDEX UI_USER_1 ON USER ( LOGIN_ID asc )这就是全部,所以如果您想优化对用户实名(NAME)的查询,只需创建另一个索引:
CREATE INDEX I_USER_2 ON USER ( NAME asc )发布于 2012-01-04 10:40:16
为了添加到@homes的答案,您应该知道您将运行什么样的查询,然后对这些查询进行优化。例如,如果您正在做大量的写操作,而没有那么多的读取,那么拥有大量的索引会导致性能问题。这有点像为一辆汽车调整发动机,你是要快速地沿着拖曳带前进,还是在为长途行驶而调整它。
不管怎样,您还询问了名称列的内容。如果要在varchar列上进行匹配,则可能值得研究全文索引的使用。
http://msdn.microsoft.com/en-us/library/ms187317.aspx
这允许您对名称进行优化搜索,在这些名称中,您可能会匹配某个名称的部分,等等。正如@home回答说的那样,它确实取决于您在编写查询时的查询和意图。
可能值得在SQL management之类的查询中创建表并使用查询执行计划,并查看索引对正在发生的行数和某种查找的影响。
http://www.sql-server-performance.com/2006/query-execution-plan-analysis/
https://stackoverflow.com/questions/8723123
复制相似问题