【发布时间】:2010-10-09 20:09:11
【问题描述】:
我正在尝试优化我的 Rails 应用程序中的一些数据库查询,但其中有几个让我很困惑。他们都在WHERE 子句中使用IN,并且都在进行全表扫描,即使似乎有适当的索引。
例如:
SELECT `user_metrics`.* FROM `user_metrics` WHERE (`user_metrics`.user_id IN (N,N,N,N,N,N,N,N,N,N,N,N))
执行全表扫描,EXPLAIN 说:
select_type: simple
type: all
extra: using where
possible_keys: index_user_metrics_on_user_id (which is an index on the user_id column)
key: (none)
key_length: (none)
ref: (none)
rows: 208
在使用IN 语句时是否不使用索引,还是我需要做一些不同的事情?这里的查询是由 Rails 生成的,所以我可以重新审视我的关系是如何定义的,但我想我应该先从数据库级别的潜在修复开始。
【问题讨论】:
-
你在 user_metrics 表中的 user_id 上有索引吗?
-
它在问题中这样说:“possible_keys: index_user_metrics_on_user_id(这是 user_id 列上的索引)”
-
你的 N 是什么意思?它们是字面常量、列还是变量?这很重要。
-
抱歉,这些是从我的 query_reviewer 插件的输出中粘贴的。实际的查询在那里有整数 - 即。在(25、26、27)
-
@blackant:你在你的表上运行分析了吗?
标签: sql mysql ruby-on-rails database optimization