如果我只是在做一个查找表,我应该使用自动生成的主键吗?

时间:2009-05-11 13:12:10

标签: asp.net sql performance

我有一个包含两个varchar(Max)列的表

Column 1      Column 2
-----------------------
URLRewitten   OriginalURL

我的网址重写为asp.net webforms网站。

当一个网址进来时,我会检查它是否在表格中,如果它是我使用的是OriginalURL。

我的问题是,如果我所做的只是查询表中的URL,并且数据库中的其他表都没有链接到该表,是否需要专用的主键字段?像一个自动编号?这会使查询更快吗?

以及如何让查询运行得更快?

编辑:我对URLRewitten有一个独特的约束。

编辑:我正在使用此表的方式..

  • 查询新请求何时进入..搜索URLRewitten以查找OriginalURL
  • 当需要在网站上显示链接时,我在OriginalURL上查询以找到我应该使用的URLRewitten网址。
  • 向表格添加新网址时,请确保该网址尚不存在。

那就是我所做的所有查询..目前。

两个列在一起将是唯一的。

7 个答案:

答案 0 :(得分:12)

您需要主键吗?是。总是。但是,看起来在你的情况下,OriginalURL可能是你的主键(我假设在OriginalURL中给定值的URLRewritten不会有多个值)。

这就是所谓的“自然键”(数据本身的一个组成部分本质上是唯一的)。这些可能很方便,但我发现它们在大多数情况下通常比它们的价值更麻烦,所以是的,我会推荐某种不透明的键(意思是与行中的数据无关的键) ,除了识别单行)。您是否想要自动编号取决于您自己。这当然很方便,虽然标识栏有各自的优点和缺点。

现在我想我会建议创建两件事:

  1. 您的身份列表的主键
  2. 对OriginalURL的唯一约束,以强制执行数据完整性。

答案 1 :(得分:5)

无论如何,我会把一个放在那里......它会使更新更容易或复制现有规则......

即。这很容易

UPDATE Rules SET OriginalURL = 'http://www.domain.com' WHERE ID = 1

--OR

INSERT INTO Rules SELECT OriginalUrl, NewUrl FROM Rules WHERE ID = 1

比这个

这更容易

UPDATE Rules SET OriginalURL = "http://www.domain.com" WHERE OriginalURL = 'http://old.domain.com'

--OR

INSERT INTO Rules SELECT OriginalUrl, NewUrl FROM Rules WHERE OriginalURL = 'http://old.domain.com'

就性能而言,如果您要通过OriginalURL进行搜索, 你应该为该列添加一个索引,

答案 2 :(得分:2)

我会使用OriginalURL作为您的主键,因为我认为这是唯一的。假设您正在使用SQL-Server,您可以使用OrigionalURL在RewrittenURL上创建一个索引作为“包含的列”,以加快查询的性能。

答案 3 :(得分:1)

搜索最近的事件时,标识列可以提供帮助:

select top 100 * from table order by idcolumn desc

我们必须知道您正在运行什么类型的查询,然后我们才能找到让它们更快的方法。

答案 4 :(得分:1)

当您在URLRewritten列上进行查询时,我认为添加自动生成的主键不会对您有所帮助。

您的URLRewritten列上有索引吗?如果没有,请创建一个:应该看到查询速度大幅提高(或许只是将URL重写为主键?)。

答案 5 :(得分:0)

我认为添加自动生成的主键不会使您的查询更快。

但是有一些事情需要考虑:

  1. 我不会那么肯定,从来没有 永远不会有任何东西将链接到这个表 :(。
  2. 我见过很多人在询问     如何删除重复项     这样的表 - 用主键     它更容易。
  3. 进行此查询     我们需要更快     了解更多有关此表和方法的信息     使用它......
  4. 在我看来,每个表,必须有自动生成的主键(即MSSQL中的标识)。

    我不相信独特的自然键。

答案 6 :(得分:0)

是的,应该有一个主键,因为您可以在该主键上设置INDEX以进行快速访问