2010-08-30 19 views
2

“OR”操作指标我有喜欢创建用于查询

where field1=val1 or field2=val2 

有的像

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

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

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

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

+0

您可能会创建一个具有相同结构的新表,但只能使用要测试的数据子集并查看哪个索引最符合您的需求。 – 2010-08-30 07:20:43

+0

这是不可能回答这样一个宽泛和简单的问题。每个特殊情况都需要它自己的解决方案。使用EXPLAIN来测试您的查询。其实,OR操作器不需要任何特殊的处理。它使用相同的索引作为'WHERE field = value'单个条件 – 2010-08-30 07:24:10

+0

您忘记告诉我们该表仅用于阅读还是有很多正在进行的CRUD操作... – 2010-08-30 08:11:29

回答

2

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

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

这将确保以您未预料到的方式使用这些列的任何查询仍然可以正常运行(对于仅使用fieldy的查询,fieldx/fieldy/field1索引将为零)。

任何体面的执行引擎都会首先有效地选择基数最低的索引,从而减少结果集,然后基于此执行其他过滤器。

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

请记住,数据库调整很少是一个设置和忘记操作。您应该定期重新调整,因为性能取决于您持有的数据的模式

即使架构永不改变,数据可能会大不相同。请回复您的评论“我只是不能通过应用索引和解释查询来进行实验”,那就是您应该做的

如果你担心在生产环境中玩游戏(你应该是),你应该建立另一个类似规格的环境,将生产数据复制到它,然后在那里摆弄你的索引。

+0

我同意你的说法。 – 2010-08-30 08:10:13

1

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

这是正确的。

对于第二个查询我打算创建2个 指标:fieldx,fieldy,Field 1和 fieldx,fieldy,FIELD2再次为 上述原因。

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

EXPLAIN将帮助你。