Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定是否正在生产站点上使用mysql索引,以便可以安全地将其删除_Mysql_Ruby On Rails - Fatal编程技术网

确定是否正在生产站点上使用mysql索引,以便可以安全地将其删除

确定是否正在生产站点上使用mysql索引,以便可以安全地将其删除,mysql,ruby-on-rails,Mysql,Ruby On Rails,我们怀疑Rails站点中没有使用一些大型索引,因此希望删除它们以节省空间和计算量。然而,如果发现它们被使用,那么这样做可能是灾难性的。我们如何确认它们没有被使用 一个选项是记录一段时间内的所有查询,并对使用该表的任何查询运行“解释计划”。但我听说“解释计划”有时会不准确。我们还必须收集几个小时的查询,这需要存储和处理大量日志 如果有一种方法可以暂时禁用索引,我们愿意这样做,只要出现问题时我们能够快速启用它。但我不认为有一种方法可以普遍做到这一点;您只能为单个sql语句指定“忽略索引”提示。这只有

我们怀疑Rails站点中没有使用一些大型索引,因此希望删除它们以节省空间和计算量。然而,如果发现它们被使用,那么这样做可能是灾难性的。我们如何确认它们没有被使用

一个选项是记录一段时间内的所有查询,并对使用该表的任何查询运行“解释计划”。但我听说“解释计划”有时会不准确。我们还必须收集几个小时的查询,这需要存储和处理大量日志


如果有一种方法可以暂时禁用索引,我们愿意这样做,只要出现问题时我们能够快速启用它。但我不认为有一种方法可以普遍做到这一点;您只能为单个sql语句指定“忽略索引”提示。

这只有一个过程:测试、测试、测试和基准测试

除了确保唯一性外,索引的主要功能是加速数据访问。如果所有操作都是O(1),那么首先就不需要索引

您需要有另一个应用程序实例,可以在其中尝试添加、删除和调整索引。复制真实世界的硬件和真实世界的负载是不可能的,但是如果您仔细注意硬件的配置方式、应用程序的运行方式,并且能够产生合理相似的结果,您就可以非常接近

如果有足够详细的应用程序日志,有时可以重播这些操作。读操作比写操作更容易重放,但如果您有足够的时间进行投资,这两种操作都可以模拟

对于任何大规模运行的应用程序,您都想知道性能会从何处跌落。只要你的生产负荷远低于这个水平,你就没事了。如果你不知道悬崖在哪里,你可能会在没有任何警告的情况下撞上它


请记住,索引不仅会占用空间(这是一个小问题),而且索引的大小会影响更新的成本,使写入的成本更高。理想的做法是只提供您需要的,但几乎不可能确定实际使用的是哪些。理论上可以使用很多,但从来没有使用过,有些不应该使用,但这是因为查询优化器有时有点笨。

简短回答

在MySQL 5.6中,可以通过使用
PERFORMANCE\u模式来实现这一点

ps_helper是一系列视图和例程,它们以更有用的方式在
PERFORMANCE_SCHEMA
中显示数据。您要查看的视图如下所示:

更详细:

禁用索引的想法在Oracle中称为“不可见索引”。MySQL不支持它们,但我也很想看到这个功能——我几个月前就已经提交了申请


删除未使用的索引非常重要,因为这有助于优化程序的性能。我在这里有一个使用ps\u helper+unused\u index视图的战争故事:

注意不要解决实际没有的问题。磁盘空间非常便宜。下面是一个工具列表,您可以使用这些工具深入了解您的系统,并找出哪种调优能够真正帮助您的用户。jet profiler总是帮助我进行mysql优化()奥利:我们确实有这个问题,但更多的是关于内存而不是磁盘。我们越来越无法将所有内容都保存在内存中,而交换会降低性能。即使存储不是问题,我们也会花费宝贵的数据库CPU在插入/更新时维护这些索引。是的,我们的数据库服务器很大,而且已达到最大值,我们正在处理表中的约10亿行。您是否搜索过您的代码库以查找字段名的任何用法?或者通过数据库迁移(如果您正在使用这种迁移)来确定何时添加索引以及在同一时间发生的任何代码更改,以了解实际存在哪些使用该索引的代码?您是否有可以重播的数据库转储(比如一天的查询流量)?如果您决定这样做,此工具会自动在记录的语句上运行
explain
,以查找未使用的索引:谢谢Morgan!我还刚刚阅读了Percona 5.6中的信息\u SCHEMA.INDEX\u统计信息-也许这是基于相同的信息?或多或少。INDEX\u STATISTICS/USER\u STATISTICS/TABLE\u STATISTICS是Google团队为MySQL发明的,Percona采用了它。与此同时,MySQL团队正在开发自己的标准(PERFORMANCE_SCHEMA)。