【问题标题】:Designing table index设计表索引
【发布时间】:2011-09-20 07:09:12
【问题描述】:

在具有 id、几个键值和几个其他“数据”列的表中:

T1 : id , k1 , k2 , k3 , data1, data2, ...

id 是唯一的。
k1 有数百个不同的值。
对于 k1 的每个不同值,k2 都有数千个不同的值。
对于 k1,k2 的每个不同组合,有几十行(或多一点),其中通常 k3 是所有这些记录的空字符串,而其他一些 k3 值每个 (k1,k2) 只会出现一次,并且偶尔会出现两三次。

我要获取一组记录where k1=K1V and K2=K2V and K3=K3V, 但我也知道这相当于询问where k1=K1V and K3=K3Vwhere k2=K2V and K3=K3V,因为 K2 的任何特定值将始终具有相同的 K1 值。

或者我应该问一下where K3=K3V and K2=K2V and K1=K1Vwhere K3=K3V and K1=K1Vwhere K3=K3V and K2=K2V? (因为K3列的空字符串值的忏悔)。

进行此查询的最佳方法是什么?我应该为此创建什么索引?

如果已知 K1 的不同值上 K2 的不同值的数量差异很大,它会改变答案吗? (即,一些 K1V 有 5 个 K2V 与之相关联,而另一些则有 100 个)

【问题讨论】:

    标签: database database-design indexing


    【解决方案1】:

    如果键之间存在依赖关系,听起来您的表未标准化。我建议首先将您的表规范化为第 3 范式,然后将索引放在外键上(至少)。然后应添加其他索引以支持特定查询。

    【讨论】:

    • 我知道它没有被规范化。而 K1 和 K2 是其他表的唯一键。但我仍然希望通过更好地理解索引来回答我的 Q。我的印象是在这种情况下拥有重复的数据可能有助于提高性能......还是我错了?
    • 您使用的是什么 DBMS,因为这可能会影响答案?我的建议是衡量性能,并选择最适合您最常见场景的性能。确保您的桌子上的统计信息保持最新。一般来说,对于 SQL Server,最好给查询优化器更多的选项来连接数据,并让它根据可用的索引和统计信息选择最佳方式。如果空间(和插入/更新性能)的考虑较少,您可以创建索引以涵盖 k1、k2、k3 的所有组合。
    猜你喜欢
    • 2011-05-29
    • 2017-03-26
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多