【问题标题】:What is the quickest way to check if user exists in a large table? (Performance Optimization)检查用户是否存在于大表中的最快方法是什么? (性能优化)
【发布时间】:2015-10-03 02:55:31
【问题描述】:

我在一个拥有大约 500,000 个用户的网站上工作,我遇到的问题是当用户创建新帐户时等待时间非常长,因为我使用此查询检查用户是否存在。

select count(userName) as userNameTotal from user_table where userName = 'hellokitty'

然后我决定他们是否可以根据 userNameTotal 是否大于 0 来创建帐户。

我打算为该列编制索引,但我认为当我尝试将用户添加到表时这也会很慢,因为每次添加用户时都需要重新创建索引列表。

是否有更快的方法来执行此操作?是否应该为该列编制索引?

【问题讨论】:

    标签: sql .net sql-server tsql indexing


    【解决方案1】:

    对于这个查询:

    select count(userName) as userNameTotal
    from user_table
    where userName = 'hellokitty'
    

    您希望在user_table(userName) 上建立索引。

    但是,这不是最有效的方法。您应该保持相同的索引并使用exists

    if (exists (select 1 from  from user_table where userName = 'hellokitty'))
    begin 
     . . .
    end;
    

    这应该比聚合版本快,因为它可以停在第一个匹配的行。

    【讨论】:

    • 正确的索引对性能的影响最大。使用exists 是除此之外的额外收获。
    • 但可以说是的,它们存在,然后它会添加用户。我觉得我会失去性能,因为每次添加用户时都需要重新创建用户名索引。我想我要说的是,当我添加用户或没有索引并检查用户名是否存在时,重新创建索引并影响性能会更慢吗?
    • 索引不需要重新创建;添加了一个新元素。索引通常更快,因为添加元素的开销比进行全表扫描以读取没有索引的表的成本要少得多。
    • 好的,谢谢,这就是我想知道的。因此,将元素添加到列索引然后进行全表扫描会更有效。
    • @LeslieJones 只需一次扫描可能不会。通过在您的应用程序中,您可能会多次搜索 userName。
    猜你喜欢
    • 1970-01-01
    • 2019-09-20
    • 2023-01-12
    • 2011-01-25
    • 2012-08-29
    • 1970-01-01
    • 2018-11-03
    • 2011-11-26
    • 2022-06-06
    相关资源
    最近更新 更多