我们怀疑有一些大型索引没有在我们的Rails站点中使用,并希望删除它们以节省空间和计算。但是,如果事实证明它们被使用,那么这样做可能是灾难性的。我们如何确认它们没有被使用?
一种选择是将所有查询记录一段时间并运行解释计划'在任何使用该表的人。但是,我已经听说过“解释计划”。偶尔可能不准确。我们还必须收集几个小时的查询以确保存储和处理的日志量很多。
如果有办法临时禁用索引,我们愿意这样做,只要我们能够在问题出现时快速启用它。但我没有看到普遍这样做的方法;你只能指定一个'忽略索引'提示单个sql语句。
答案 0 :(得分:2)
简答:
使用MySQL 5.6,可以使用PERFORMANCE_SCHEMA
和ps_helper来完成此操作。
ps_helper是一系列视图和例程,以更有用的方式呈现PERFORMANCE_SCHEMA
中的数据。您所追求的VIEW就是这一个:http://www.markleith.co.uk/ps_helper/#schema_unused_indexes
更详细:
禁用索引的想法在Oracle中称为“隐形索引”。 MySQL不支持它们,但我也很想看到这个功能 - 几个月前我就提交了http://bugs.mysql.com/bug.php?id=70299。
删除未使用的索引非常重要,因为它可以帮助优化器性能。我有一个关于在这里使用ps_helper + unused_indexes视图的战争故事:http://www.tocker.ca/2013/09/05/migrating-from-postgresql-to-mysql.html
答案 1 :(得分:0)
只有一个程序:测试,测试,测试和基准测试。
除了确保唯一性之外,索引的主要功能是加速数据访问。如果所有操作都是O(1),那么首先就不需要索引。
您需要拥有应用程序的另一个实例,您可以尝试添加,删除和调整索引。复制现实世界的硬件和实际负载是不可能的,但是如果你仔细关注硬件的配置方式,应用程序的运行方式以及产生的应用程序,那么你可以非常接近。相当相似。
如果您的应用程序日志足够详细,有时您可以重播这些操作。读取操作比写入更容易重放,但如果你有足够的时间来投资,可以模拟两者。
对于大规模运行的任何应用程序,您想知道性能从悬崖上掉下来的地方。只要您的生产负荷远低于这个水平,您就可以了。如果你不知道悬崖在哪里,你可能会在没有任何警告的情况下击中悬崖。
请记住,索引不仅占用空间,这是一个小问题,但索引的大小会影响更新的成本,使写入成本更高。理想的是只拥有你需要的那些,但几乎不可能确定哪些实际使用。有许多可能在理论上使用,但从来没有,有些不应该使用,但这是因为查询优化器有时会有点愚蠢。