代码之家  ›  专栏  ›  技术社区  ›  Midhat

为查询中的“OR”运算符创建索引

  •  3
  • Midhat  · 技术社区  · 14 年前

    where field1=val1 or field2=val2
    

    还有一些类似的

    where fieldx=valx and fieldy=valy and (field1=val1 or field2=val2)
    

    对于第二个查询,出于上述原因,我打算创建两个索引:fieldx,fieldy,field1和fieldx,fieldy,field2。

    这个解决方案正确吗?这是一个非常大的表,所以我不能仅仅通过应用索引和解释查询来进行实验。

    2 回复  |  直到 14 年前
        1
  •  4
  •   paxdiablo    14 年前

    与所有DBMS优化问题一样,这取决于您的执行引擎。

    我将从最简单的场景开始,每个列上有四个单独的索引。

    这将确保以您没有预料到的方式使用这些列的任何查询仍然可以正常运行(a) fieldx/fieldy/field1 fieldy ).

    任何一个好的执行引擎都会首先有效地选择基数最小的索引,从而减少结果集,然后在此基础上执行其他过滤器。

    只有 如果您有性能问题,可以考虑使用不同的索引来改进它。您应该测试生产类型数据的性能,而不是您自己构建的任何测试数据库(除非它们反映了生产类型的属性)。

    你掌握的数据。

    你应该做什么。

    如果您担心在生产环境中玩游戏(您应该担心),那么您应该使用类似的规范设置另一个环境,将生产数据复制到其中,然后在那里摆弄索引。

        2
  •  3
  •   Tom H zenazn    14 年前

    我的直觉是创造独立的 字段1和字段2的索引 第一个查询,因为它是一个OR,所以是一个 综合指数可能不会有太大作用 很好。

    对于第二个查询,我打算创建2 索引:fieldx、fieldy、field1和 上述理由。

    这是一个选项,另一个是fieldx、fieldy、field1上的索引和field2上的索引(与第一个查询相同!)。现在也有两个索引,但第二个索引要小得多。第二个查询可以同时使用两个索引,较大的索引用于查询的AND部分,较小的索引用于field2的OR部分。MySQL现在应该足够聪明了。

    解释会帮你的。