【问题标题】:Partial key lookups部分键查找
【发布时间】:2013-03-25 01:30:47
【问题描述】:

假设有一个非主键列 (A,B,C,D) 的表在 (A,B,C,D) 上有一个索引

涉及 (A,B,C,D) 子集的查询会使用索引吗?如上所述,部分键查找存在哪些特质?

我对它在 SQL Server、Sqlite、Firebird 中的工作方式特别感兴趣。

【问题讨论】:

    标签: sql sql-server sqlite indexing firebird


    【解决方案1】:

    使用索引初始子集的查询应该使用索引。

    因此,(A)、(A) 和 (B) 以及 (A) 和 (B) 和 (C) 上的等值连接应该使用索引。

    其实你也可以添加一个不等式,所以,索引应该支持以下所有:

    • x.A = y.A
    • x.A = y.A 和 x.B > y.B
    • x.A = y.A 和 x.B = y.B
    • x.A = y.A 和 x.B = y.B 和 x.C > y.C
    • x.A = y.A 和 x.B = y.B 和 x.C = y.C
    • x.A = y.A 和 x.B = y.B 和 x.C = y.C 和 x.D > y.D
    • x.A = y.A 和 x.B = y.B 和 x.C = y.C 和 x.D = y.D

    【讨论】:

    • x.C = y.C 怎么样?这会导致全表扫描吗?
    • 这应该导致索引扫描而不是表扫描。它比表扫描快,但不如上面列出的 Gordon 场景中的索引查找快。还有更多信息here
    【解决方案2】:

    是的,如果搜索键与索引字段的顺序相同。

    否则没有。假设您被指示去图书馆,请查看“了不起的盖茨比”,第 3 章,第三页。这就像使用多字段索引。

    现在说,你被告知要获得第 3 章,第三页....没有书名。您必须查看每一本书。

    【讨论】:

    • 所以为了支持这种情况,我必须分别在 A、B、C、D 上声明 4 个单独的索引?例如。 "获取所有第 3 章以 'The%' 开头的书籍"
    • 是的。缺点是插入和更新变得更加昂贵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多