我对 Mysql 中的可见索引和不可见索引感到困惑。哪个最好?
我有一个数据库表,其中行数约为 1M 行。之前的开发团队并没有给表列添加索引。现在我们需要为某些列添加索引以加快获取查询的速度。在对列进行索引时,我对可见列和不可见列感到困惑。
请任何人解释一下哪个是最好的选择。我尝试从在线教程中学习,但我无法弄清楚。
Bil*_*win 17
开发数据库时出现一个问题:“我们真的需要所有这些索引吗?”
索引需要一些开销才能与数据保持同步。如果需要索引来优化某些查询,通常值得保留索引。但是,如果任何查询都没有使用该索引,则可能是时候删除该索引了。但你怎么能确定它不需要呢?
如果事实证明需要索引,为什么不通过删除索引并重新创建它来进行测试呢?因为表变得非常非常大,并且重新添加索引可能需要很长时间。在一个案例中,我支持的一位开发人员放弃了他认为不需要的索引。事实证明这很重要。但是添加索引花了四个星期,因为表太大了,而且服务器正在努力跟上其他查询。与此同时,需要该索引的查询运行得非常糟糕。
最好以某种方式让 MySQL 暂时假装索引不存在,然后在他们认为索引很重要时翻转开关并使索引再次可见。
https://dev.mysql.com/doc/refman/8.0/en/invisible-indexes.html说:
MySQL支持不可见索引;也就是说,优化器不使用的索引。
不可见索引可以测试删除索引对查询性能的影响,而无需进行破坏性更改(如果需要索引则必须撤消这种更改)。对于大型表来说,删除和重新添加索引的成本可能很高,而使其不可见和可见则是快速的就地操作。
不可见索引是存在的索引,并且在运行 INSERT/UPDATE/DELETE 语句时仍与数据保持同步。但优化器将其视为索引不存在。
查询中的索引提示可以禁止使用任何索引,这就是我们在 MySQL 5.x 期间必须测试的方式。但这需要找到所有将使用该索引的 SQL 查询,并更改应用程序代码。如果您的查询是由 ORM 代码层生成的,这尤其不方便。