我有一个包含两个varchar(Max)列的表
Column 1 Column 2
-----------------------
URLRewitten OriginalURL
我的网址重写为asp.net webforms网站。
当一个网址进来时,我会检查它是否在表格中,如果它是我使用的是OriginalURL。
我的问题是,如果我所做的只是查询表中的URL,并且数据库中的其他表都没有链接到该表,是否需要专用的主键字段?像一个自动编号?这会使查询更快吗?
以及如何让查询运行得更快?
编辑:我对URLRewitten有一个独特的约束。
编辑:我正在使用此表的方式..
那就是我所做的所有查询..目前。
两个列在一起将是唯一的。
答案 0 :(得分:12)
您需要主键吗?是。总是。但是,看起来在你的情况下,OriginalURL可能是你的主键(我假设在OriginalURL中给定值的URLRewritten不会有多个值)。
这就是所谓的“自然键”(数据本身的一个组成部分本质上是唯一的)。这些可能很方便,但我发现它们在大多数情况下通常比它们的价值更麻烦,所以是的,我会推荐某种不透明的键(意思是与行中的数据无关的键) ,除了识别单行)。您是否想要自动编号取决于您自己。这当然很方便,虽然标识栏有各自的优点和缺点。
现在我想我会建议创建两件事:
答案 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)
我认为添加自动生成的主键不会使您的查询更快。
但是有一些事情需要考虑:
在我看来,每个表,必须有自动生成的主键(即MSSQL中的标识)。
我不相信独特的自然键。
答案 6 :(得分:0)
是的,应该有一个主键,因为您可以在该主键上设置INDEX以进行快速访问