0

我正在使用:Rails 3.2.13 和 PostgreSQL 9.4.7

我有 2 个产品表,AProducts两个BProducts.表都有一个category_id整数,它是一个索引列,两个表都有几百万条记录。

当我查询AProductscategory_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 相同的速度获取记录,为什么这不是我看到的默认行为?

4

1 回答 1

0

也许您的表没有真正被索引?

在 Rails 控制台上检查:ActiveRecord::Base.connection.indexes(:table_name)

您也可以直接在 postgres 上执行此操作:SELECT indexname FROM pg_indexes;

于 2018-05-14T03:14:02.163 回答