繁体   English   中英

繁忙的表,索引或不索引

[英]Busy table, to index or not to index

SQL 服务器,非常繁忙的表,随时为大约 6-10K 用户保存活动,并且每次点击都有插入/更新/删除。

我没有在这张表上使用索引,因为写入的任何数据都不会停留超过 10 分钟。

但是在观看活动监视器时,我注意到 SQL 服务器建议向该表添加索引。

我知道在表上保留索引有其成本,您认为我应该添加索引吗?

更新细节: SQL 2008 R2

桌子

     [id] [bigint] IDENTITY(1,1) NOT NULL,
     [siteid] [int] NOT NULL,
     [last_seen] [datetime] NOT NULL,
     [ua] [varchar](250) NOT NULL,
     [ip] [varchar](15) NOT NULL,
     [t_id] [int] NOT NULL

建议索引

ON [dbo].[onlines] ([ua],[ip],[t_id])

拥有一个好的集群键实际上甚至可以加快您的插入速度(阅读 Kimberly Tripp 的优秀博客文章The Clustered Index Debate Continues以获得一个很好而彻底的解释,为什么会这样),并且从它的外观来看。 你根本没有聚类键。

所以我肯定会推荐在你的id列上添加一个主键/集群键 - 它非常适合一个好的集群键:窄,static,独特,不断增加:

CREATE UNIQUE CLUSTERED INDEX CIX_YourTableName
  ON dbo.YourTableName(ID)

这应该会加速一切——插入、更新、删除和 select。

您是否需要其他索引(以及要索引的列)取决于您的 SELECT 查询 - 因为您并没有真正告诉我们有关这些的任何信息,我们只能猜测蓝色.....

基本上,你需要做的:

  • 建立基线 - 衡量你的表现
  • 然后应用一个有意义的索引 - 包括 WHERE 子句和/或 ORDER BY 表达式中使用的列
  • 再次测量并比较

真的没有什么神奇的公式可以决定你是否需要一个索引,它是什么,以及它对你的场景有多大帮助(或者它会对 INSERT 性能有多大影响)——你需要在你的数据库、你的硬件上衡量自己, 你的环境。

在写入表期间添加索引成本。 (插入、更新、删除操作)。 它可以提高读取性能(SELECT、UPDATE、DELETE 操作)。 因此,如果您的读取次数多于写入次数,那么可以,索引可以帮助您。 如果你读的比写的少,那么索引可以帮助你,因为你不必读那么多(索引基本上是表的一个小子集,如果你的 select 只命中那个子集,那么你可以加快读取速度在某些情况下相当)

我会添加索引并监控性能,如果它不适合你然后删除索引。 最终,唯一确定的方法是尝试并比较结果。

数据存在的时间并不能告诉您索引的需要。 但是更新率与读取率确实如此。 没有索引的插入是最快的。 更新和删除可能不是,因为在搜索要更改的记录时,它们可能会受益于索引。 选择也受益于索引。

所以通常最好有索引,即使一个表有很多更新。 一般的例外是用于记录的表,您通常只在其中写入,除非您确实需要日志。

但可以肯定的是,您最好在其中放置一个索引并监控性能的影响或提升。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM