Sql server 在文本列上创建索引是否会增加搜索成本?
将字符串列作为主键而不是整数列是否会对搜索时间和/或插入时间产生不利影响 场景 a。任何应用程序的一种常见情况是,每次有人创建新用户帐户时都进行此查询: 该用户名是否已经存在,或者是否被其他人使用 b。当一个人登录时,需要进行另一个查询以查找用户名,如下所示:Sql server 在文本列上创建索引是否会增加搜索成本?,sql-server,database,database-design,architecture,sql-server-2014,Sql Server,Database,Database Design,Architecture,Sql Server 2014,将字符串列作为主键而不是整数列是否会对搜索时间和/或插入时间产生不利影响 场景 a。任何应用程序的一种常见情况是,每次有人创建新用户帐户时都进行此查询: 该用户名是否已经存在,或者是否被其他人使用 b。当一个人登录时,需要进行另一个查询以查找用户名,如下所示: User表中是否存在具有该用户名的行 c。同样,当用户说他们忘记了密码时,我们需要根据他们的电子邮件进行搜索 User表中是否存在包含该电子邮件的行 d。只有在将User表与其他与用户相关的表(如UserRole、UserClaim等)链
User
表中是否存在具有该用户名的行
c。同样,当用户说他们忘记了密码时,我们需要根据他们的电子邮件进行搜索
User
表中是否存在包含该电子邮件的行
d。只有在将User
表与其他与用户相关的表(如UserRole
、UserClaim
等)链接的情况下,我们可能需要基于整数Id
将它们连接起来,如下所示:
SELECT *
FROM User, UserClaim
WHERE User.Id = UserClaim.UserId;
将整数作为主键与将字符串作为主键相比
到目前为止,我一直只拥有一个带有整数主键(以及聚集索引)的用户表,如下所示:
User
-----
Id int primary key identity(1, 1),
UserName nvarchar(50) not null,
Email nvarchar(100) not null,
PasswordHash nvarchar(32) not null
然而,现在仔细考虑我上面描述的用例,我想知道是否完全消除整数主键,而将用户名
或电子邮件
字段中的一个作为主键更有效,如下所示:
User
-----
UserName nvarchar(50) primary key,
Email nvarchar(100) not null,
PasswordHash nvarchar(32) not null
这将在UserName
字段上创建一个聚集索引,可能会加快上述a和b场景中的查询速度,但我不确定影响情景c和d,因为这取决于速度或比较整数与比较基于字符串列的指数的速度
问题
然而,这让我在投入这项设计之前,有一些需要解决的问题:
在上面这样的文本字段上创建聚集索引是否会影响性能?它如何影响插入时间?搜索时间
我可以想象,在整数上创建索引比在字符串上创建索引快吗
我们只能有一个聚集索引。如果我允许我的用户使用他们喜欢的用户名或电子邮件登录,那么我将不得不同样频繁地在用户名
和电子邮件
字段上进行搜索。我该怎么办?我是否应该在电子邮件
字段上创建非聚集索引
将字符串列作为主键是否会影响我与其他链接表的连接性能,如:
SELECT * FROM User, UserRole
WHERE User.UserName = UserRole.UserName;
考虑到#3,看起来我应该在User
表中保留整数Id
列,并在UserName
和Email
列上分别创建一个非聚集索引
我正在使用Microsoft SQL Server 2014
在上面这样的文本字段上创建聚集索引有什么好处吗
性能影响?它如何影响插入时间?搜寻
时代
- 每个非聚集索引的每一行都将包含聚集索引键作为rowkey
INT=4字节
,您的unicode字符串列电子邮件
可能会占用NVARCHAR(100)=最多200字节
李>
- 聚集索引适用于范围扫描。电子邮件地址的范围扫描几乎是不可能的
- 基于身份的聚集索引可以保证几乎零碎片和快速插入,因为没有页面拆分
我们只能有一个聚集索引。如果我允许我的用户登录
使用用户名或电子邮件,任何他们喜欢的人,然后我就去
必须在用户名和电子邮件字段上进行搜索,就像
频繁地我该怎么办?我应该制作一个非聚集索引吗
在电子邮件领域
是的,如果您决定在用户名
上建立一个唯一的聚集索引,您将希望在电子邮件
上建立另一个非聚集索引。如果用户将通过电子邮件
列进行搜索,则列用户名将自动成为此类索引的一部分(由于上面一点中解释的原因),并且此类索引将被覆盖
将字符串列作为主键会对
连接的性能
UserName
列上的聚集索引是此类联接的最佳选择,因为它将保持数据的预排序,因此在大型数据集上,HASH
联接更有可能被MERGE
联接取代
考虑到#3,看起来我应该只保留integer Id列
在用户表中,并在
用户名和电子邮件栏
这在很大程度上取决于你的工作量。如果您必须经常在列UserName
上加入该表,则该列上的聚集索引可能适合您。在这种情况下,您可以在字段电子邮件
上创建一个非聚集的唯一索引,并在ID
上保留一个主键,但也可以使其非聚集
(这篇文章基本上是基于个人观点)
在上面这样的文本字段上创建聚集索引有什么好处吗
性能影响?它如何影响插入时间?搜寻
时代
- 每个非聚集索引的每一行都将包含聚集索引键作为rowkey
INT=4字节
,您的unicode字符串列电子邮件
可能会占用NVARCHAR(100)=最多200字节
李>
- 聚集索引适用于范围扫描。电子邮件地址的范围扫描几乎是不可能的
- 基于身份的聚集索引可以保证几乎零碎片和快速插入,因为没有页面拆分
我们可以继续