我正在使用:Rails 3.2.13 和 PostgreSQL 9.4.7
我有 2 个产品表,AProducts两个BProducts.表都有一个category_id整数,它是一个索引列,两个表都有几百万条记录。
当我查询AProducts时category_id,响应很快并且使用索引,但是当我查询时BProducts响应非常非常慢,并且它使用顺序扫描而不是使用索引。我试图弄清楚为什么会发生这种情况BProducts,因为表格和模型几乎与AProducts. 以下是 EXPLAIN 的结果:
irb(main):2290:0> BProduct.where(:category_id => 700).explain
BProduct Load (219696.7ms) SELECT "b_products".* FROM "b_products" WHERE "b_products"."category_id" = 700
EXPLAIN (1.3ms) EXPLAIN SELECT "b_products".* FROM "b_products" WHERE "b_products"."category_id" = 700
=> "EXPLAIN for: SELECT \"b_products\".* FROM \"b_products\" WHERE \"b_products\".\"category_id\" = 700\n QUERY PLAN\n-----------------------------------------------------------------------------\n Seq Scan on b_products (cost=0.00..1791663.25 rows=926 width=2036)\n Filter: (category_id = 700)\n(2 rows)\n"
上面的慢查询耗时 219696.7ms,并且不使用索引。下面对 AProduct 的查询很快,并且确实使用了索引。
irb(main):2289:0> AProduct.where(:category_id => 700).explain
AProduct Load (51.0ms) SELECT "a_products".* FROM "a_products" WHERE "a_products"."category_id" = 700
EXPLAIN (1.2ms) EXPLAIN SELECT "a_products".* FROM "a_products" WHERE "a_products"."category_id" = 700
=> "EXPLAIN for: SELECT \"a_products\".* FROM \"a_products\" WHERE \"a_products\".\"category_id\" = 700\n QUERY PLAN\n--------------------------------------------------------------------------------------------------------------------------------\n Index Scan using index_a_products_on_category_id on a_products (cost=0.56..5448.33 rows=1359 width=883)\n Index Cond: (category_id = 700)\n(2 rows)\n"
我想弄清楚的是,如何让我的 BProduct 查找使用索引并以与 AProduct 相同的速度获取记录,为什么这不是我看到的默认行为?