【问题标题】:Composite primary key limit?复合主键限制?
【发布时间】:2013-06-02 17:41:49
【问题描述】:

如果我从 4 列创建复合主键可以吗?喜欢:

PRIMARY KEY(name, slug, type, parent)

因此不应有超过一行具有相同名称、slug、类型和父项。列太多了吗?会影响性能吗?

顺便说一句,我正在使用 sqlite。

【问题讨论】:

  • 您正在使用 SQLite 并担心性能?您希望存储多少行?
  • 10000 最大。 “父”表将有几百个

标签: sql sqlite indexing primary-key composite


【解决方案1】:

通常建议使用自己唯一的 ID 字段。比较 INTEGER 值比比较字符串更快,因此您的复合键会对性能产生负面影响。

如果您要加入其他表,添加具有以下数据类型的列将是理想的:

 INTEGER PRIMARY KEY AUTOINCREMENT

【讨论】:

  • 但 ID 对我来说毫无价值,因为我主要需要按名称、类型和父级进行查询。 slug 没那么重要,但它必须是独一无二的
  • 该表是否曾经连接到其他表?我想我应该先问一下,只是不习惯用一张桌子来考虑 DB。
  • 我还没有使用连接,但是父列链接到另一个表的“名称”列。但是既然您提到了 ID,我想我可以更改代码以以某种方式使用 ID:s
  • 如果进行任何链接,我会说 ID 比名称更好。
  • 虽然通常建议添加 id 字段,但我建议您不要这样做,除非您有充分的理由这样做。复合主键在数据仓库事实表和建立多对多关系的表中是相当正常的。基本上,您首先必须知道为什么要考虑使用复合键。
【解决方案2】:

SQLite 的限制为 2000 columns in an index

4 列索引的性能与 3 列索引的性能差别不大。

但是,通用性能声明并不有趣。 对你来说重要的是这个表结构对你来说性能是否足够,你只能通过测量它来发现。


请注意,如果您只查找一列,则该列must be the first one in an index 允许使用索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    相关资源
    最近更新 更多