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

Mid*_*hat 5 mysql sql indexing query-optimization

我有一些 MySQL 查询,条件如下

where field1=val1 or field2=val2
Run Code Online (Sandbox Code Playgroud)

有些人喜欢

where fieldx=valx and fieldy=valy and (field1=val1 or field2=val2)
Run Code Online (Sandbox Code Playgroud)

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

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

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

pax*_*blo 4

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

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

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

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

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

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

即使架构永远不会改变,数据也可能会有很大差异。关于您的评论“我只是无法通过应用索引和解释查询来进行实验”,这正是应该做的。

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