Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在文本列上创建索引是否会增加搜索成本?_Sql Server_Database_Database Design_Architecture_Sql Server 2014 - Fatal编程技术网

Sql server 在文本列上创建索引是否会增加搜索成本?

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等)链

将字符串列作为主键而不是整数列是否会对搜索时间和/或插入时间产生不利影响

场景

a。任何应用程序的一种常见情况是,每次有人创建新用户帐户时都进行此查询:

该用户名是否已经存在,或者是否被其他人使用

b。当一个人登录时,需要进行另一个查询以查找用户名,如下所示:

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
字段上创建一个聚集索引,可能会加快上述ab场景中的查询速度,但我不确定影响情景cd,因为这取决于速度或比较整数与比较基于字符串列的指数的速度

问题

然而,这让我在投入这项设计之前,有一些需要解决的问题:

  • 在上面这样的文本字段上创建聚集索引是否会影响性能?它如何影响插入时间?搜索时间

    我可以想象,在整数上创建索引比在字符串上创建索引快吗

  • 我们只能有一个聚集索引。如果我允许我的用户使用他们喜欢的用户名或电子邮件登录,那么我将不得不同样频繁地在
    用户名
    电子邮件
    字段上进行搜索。我该怎么办?我是否应该在
    电子邮件
    字段上创建非聚集索引

  • 将字符串列作为主键是否会影响我与其他链接表的连接性能,如:

    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字节
    • 聚集索引适用于范围扫描。电子邮件地址的范围扫描几乎是不可能的
    • 基于身份的聚集索引可以保证几乎零碎片和快速插入,因为没有页面拆分
    我们可以继续