MySQL中的Visible INDEX和Invisible INDEX是什么?

6

我对Mysql中的Visible INDEX和Invisible INDEX感到困惑,哪个更好?

我有一个包含大约1M行记录的数据库表。之前的开发团队没有在表列上添加索引。现在我们需要为一些列添加索引以加速查询。 在为列添加索引时,我对可见索引和不可见索引感到困惑。

请问有没有人可以解释一下哪个是最佳选择。我尝试从在线教程中学习,但是我弄不清楚。


不可见索引只是为了让优化器忽略它。如果您想要使用索引来提高性能,则应该将其设置为可见(默认)。有关不可见索引的更多信息,请参见此处 - https://dev.mysql.com/doc/refman/8.0/en/invisible-indexes.html。当在操作中感觉到索引没有带来好处时,通常会使用不可见特性,而不是删除它,以查看性能差异。标记为不可见的索引可以在计划维护期间稍后删除,前提是它没有导致任何性能降低。 - Pankaj
展示你的主要查询;我们将帮助您设计最佳的索引。同时,假装“INVISIBLE”不存在,它只会分散你的注意力。 - Rick James
2个回答

15
在开发数据库时,一个问题经常出现:“我们真的需要所有这些索引吗?”索引会带来一些开销,用于保持与数据同步。如果索引需要优化某些查询,通常值得保留索引。但是,如果没有任何查询使用该索引,那么可能是时候删除该索引了。但是,如何确定它不需要呢?
为什么不通过删除索引并在需要时重新创建它进行测试?因为表变得非常大,重新添加索引可能需要很长时间。在一个案例中,我支持的一个开发人员删除了他认为不需要的索引。结果证明它很重要。但是由于表格太大,重新添加索引花了四个星期,服务器只是艰难地跟上其他查询。同时,需要该索引的查询运行极其缓慢。
最好的方法是让MySQL临时“假装”该索引不存在,然后在决定其重要性时切换并使索引再次可见。

https://dev.mysql.com/doc/refman/8.0/en/invisible-indexes.html说:

MySQL支持不被优化器使用的隐藏索引。

隐藏索引使得能够测试删除索引对查询性能的影响,而不会造成破坏性的更改,如果该索引是必需的,则必须撤消更改。 对于大型表而言,删除和重新添加索引可能很昂贵,而使其隐藏和可见则是快速的原地操作。

隐藏索引是存在的索引,并且在运行INSERT / UPDATE / DELETE语句时仍与数据保持同步。但是,优化器会将其视为不存在。

查询中的索引提示可以抑制任何索引的使用,这是我们在MySQL 5.x期间进行测试的方式。但是,这需要找到所有将使用该索引的SQL查询,并更改应用程序代码。 如果您的查询由ORM代码层生成,则特别不方便。


5

简单来说:

可见索引是正在工作或激活的索引。

不可见索引是被标记为已删除的索引,已经被移除了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接