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

时间:2010-08-30 07:17:26

标签: sql mysql query-optimization indexing

我有一些像

这样的条件的MySQL查询
where field1=val1 or field2=val2

和某些人一样

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

如何通过创建索引来优化这些查询?我的直觉是为第一个查询创建第一个查询的field1和field2的单独索引,因为它是一个OR,因此复合索引可能不会有太大的好处。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

这将确保以您未预料到的方式使用这些列的任何查询仍然可以正常运行(fieldx/fieldy/field1索引仅对使用fieldy的查询无效。< / p>

任何体面的执行引擎都会首先有效地选择具有最低基数的索引,以便减少结果集,然后根据它执行其他过滤器。

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

请记住,数据库调优很少是一种“一劳永逸”的操作。您应该定期重新调整,因为性能取决于架构您持有的数据。

即使架构永远不会改变,数据也可能会有很大差异。重新发表评论“我只是通过应用索引和解释查询来进行实验”,这是完全你应该做什么。

如果你担心在制作中玩(你应该这样),你应该设置另一个具有类似规格的环境,将生产数据复制到它,然后在那里摆弄你的索引。

答案 1 :(得分:2)

  

我的直觉是创造独立的   field1和field2的索引   第一个查询,因为它是一个OR,所以a   综合指数可能不会做太多   好。

这是正确的。

  

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

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

EXPLAIN会帮助你。