在Rails中,我一直在尝试构建加快查询的数据库索引,但我经常发现在运行迁移数据库以构建新索引后,它仍然没有使用我正在构建的索引(即使它们对我来说似乎是完美的)。
在Rails中是否有一个工具可以搜索整个系统并识别需要创建的特定索引以获得最佳性能?
如果没有,是否有任何特定的规则来确定为什么我的数据库没有使用我精心设计的索引?
本质上,我的问题是:我如何避免我当前的过程,1)运行迁移创建一堆可能的索引,2)发现它们不起作用,3)回滚并对我的数据库明显的近视感到有点沮丧?
如果您的所有查询都是SELECT * FROM的一种形式,那么索引可能不会被使用。首先调优查询,以便只返回每个视图所需的数据,然后从那里构建索引。
同时,你可以在数据库上运行EXPLAIN来处理每一个查询,这将比Ruby社区提供的任何gem/插件都更有启发性。
您使用的是什么数据库?您应该做一些查询日志分析,这样您就可以看到正在运行的查询,频率,所用时间等. ...postgres的一个好工具是pgine。Mysql有慢速的查询日志,因此您可以找到最严重的违规者。有了这些数据,您就可以在最慢的查询上运行explain,看看添加哪些索引是有意义的,等等。
你能提供一些慢速查询和你当前模式和索引的例子吗?
查看https://github.com/eladmeidar/rails_indexes,它会扫描缺失的索引。
与查询效率相关,但不一定是索引是https://github.com/flyerhzm/bullet,它会通知您诸如N+1查询和急于加载机会之类的事情。