在Rails 3.2.13应用程序中,我使用query_reviewer gem来提高我的数据库性能。
生成SQL的代码是:
@seo_keywords = SeoKeyword.order("category, keyword")
它生成了以下SQL警告:
MSG: No index was used here. In this case, that meant scanning 64 rows.
SQL: SELECT SQL_NO_CACHE `seo_keywords`.* FROM `seo_keywords` ORDER BY category, keyword
所以我生成了以下数据库迁移:
def up
add_index :seo_keywords, :category
add_index :seo_keywords, :keyword
end
迁移将索引添加到表中,如模式所示:
add_index "seo_keywords", ["category"], :name => "index_seo_keywords_on_category"
add_index "seo_keywords", ["keyword"], :name => "index_seo_keywords_on_keyword"
我重启了服务器,加载了页面并得到了同样的错误。我想我正在错误地创建索引?
感谢您的帮助。
答案 0 :(得分:1)
在某些情况下(并且仅在某些RDBMS中),对于某些目的而言,使用索引执行订单可能更有效,而不是将记录排序为查询执行中的单独步骤。
这样做的主要优点是它可以更快地为大型数据集带回第一行。
但是,它有一些缺点,即在某些字符排序情况下需要语言排序索引,并且在访问数据方面通常效率较低,因此要返回的最后一行可能会在以后使用索引辅助顺序返回-by。
此外,如果您访问的表的每一行只有少量行(并且它们没有散布在很大程度上为空的空间的表中),那么对表进行全面扫描通常同样有效。甚至使用一个独特的索引。
这些细微之处很难被考虑在内,几乎所有试图提供100%完成的数据库外部的方法“这就是你需要的索引”解决方案在某种程度上会有缺陷,所以结果总是需要掌握一些内部数据库知识。
在这种情况下(选择所有64行并按两列排序)可能有所不同的是复合索引:
add_index "seo_keywords", ["category", "keyword"], :name => "index_seo_keywords_on_category_keyword"
但是如果它们是字符串,那么可能需要一个特殊的索引(我恐怕不是mysql专家)。
此外,根据mysql索引是否为空,您可能需要确保在数据库级别将类别和/或关键字约束为nul。