【问题标题】:Should i search content on database by id or name?我应该按 ID 还是名称搜索数据库中的内容?
【发布时间】:2009-08-28 17:57:54
【问题描述】:

我有一个 CMS,它有两种查询内容的方法。一种按 id 查询,另一种按内容名称查询。

ContentManager.Select(12);

ContentManager.Select("Content Name");

我看到第一个的方式会更快,因为 id 是一个索引,不涉及字符串比较。而第二个更容易使用。

出于维护原因,我使用过第二个。但是,如果我更改内容名称,则 Select 显然不再起作用。但是 Id 应该只是 o 数据库级别,并且在 CMS 表单中不可见。

编辑:此外,如果要删除并重新插入内容,则字符串 select 将起作用,而 id select 则不起作用。

我无法在这两种方法之间找到一个共同点。

【问题讨论】:

  • 您是否注意到任何速度问题?您是否进行了负载测试以查看 CMS 是否使用预期负载下的名称响应足够快?您应该能够向内容名称列添加索引,尽管它的速度不如主键。

标签: database content-management-system


【解决方案1】:

按主键选择可提供最佳性能,但这并不总是您的唯一动机。您也许可以向内容名称列添加索引,具体取决于它的宽度和您的读/写比率(我想还取决于您对数据库的控制程度)。

判断,如果您有 id,请按 id 选择,如果您没有并且不会破坏您的表现,请不要使用内容名称。

【讨论】:

  • PK 搜索并不“总是”最好的...取决于索引。如果 PK 是 1000 字节宽的五列复合键,并且另一个索引存在于仅 4 字节宽的代理整数键上,则在代理备用键上搜索会更快
  • @Charles:那你为什么要把它作为你的主键,而不仅仅是一个唯一的约束?我永远不会这样做,除非您的数据库实现总是使用主键作为聚集索引或其他东西。
  • 我将我的示例限制在非常简单的讨论中,我们有两列,据我所知,这两列都唯一地标识了一行。从技术上讲,在这种情况下,'id' 是字符串列的代理键,如果实际上字符串列唯一标识行的话。 'id' 列恰好有聚集索引,所以你能做很多奇怪的事情来搞砸主键并使其搜索不理想吗?绝对地。但在一般情况下,对于一个整数(最有可能是自动递增的列)上的聚集索引主键,按 id 搜索是最快的。
【解决方案2】:

取决于哪个索引...所以是的,您是对的,在这种情况下使用 ID...如果还需要按名称搜索,请使用该名称添加另一个索引..

【讨论】:

  • ID 版本如果是用于聚集索引的列,仍然会更快。假设您正在检索整个行。
  • 对于检索一行,这无关紧要。如果索引有六个级别,那么它将是七个 IO 与六个...用于检索两个集群之间的一整组行索引值,那么聚集索引会大大加快。
【解决方案3】:

ID 通常在数据库中效果最好。但是,您受 CMS 的摆布,它可能将它们存储在一个数组中并使用相同的精确选择语句。谁知道?查看源代码,看看发生了什么。

无论你做什么,在你的所有代码中都坚持一种风格。

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多