【问题标题】:Getting very slow execution time for a postgresql querypostgresql 查询的执行时间非常慢
【发布时间】:2018-11-20 13:04:48
【问题描述】:

我对此查询进行了解释分析,它给了 30 毫秒,但如果数据更多,我将执行过期;使用 PostgreSQL 10

正常执行:https://explain.depesz.com/s/gSPP

对于慢速执行:https://explain.depesz.com/s/bQN2

SELECT inventory_histories.*, order_items.order_id as order_id FROM
"inventory_histories" LEFT JOIN order_items ON (order_items.id = 
inventory_histories.reference_id AND inventory_histories.reference_type = 4) 
WHERE "inventory_histories"."inventory_id" = 1313 AND 
(inventory_histories.location_id = 15) ORDER BY inventory_histories.id DESC 
LIMIT 10 OFFSET 0;

索引:

"inventory_histories_pkey" PRIMARY KEY, btree (id)
"inventory_histories_created_at_index" btree (created_at)
"inventory_histories_inventory_id_index" btree (inventory_id)
"inventory_histories_location_id_index" btree (location_id)

【问题讨论】:

  • PostgreSQL MySQL。我已经删除了不相关的标签。

标签: sql ruby-on-rails postgresql


【解决方案1】:

对于这个查询:

SELECT ih.*, oi.order_id as order_id
FROM "inventory_histories" ih LEFT JOIN
     order_items oi
     ON oi.id = ih.reference_id AND
        ih.reference_type = 4 
WHERE ih."inventory_id" = 1313 AND 
      ih.location_id = 15
ORDER BY ih.id DESC 
LIMIT 10 OFFSET 0;

对于此查询,您需要 inventory_histories(inventory_id, location_id, id, reference_id)order_items(id, reference_type, order_id) 上的复合索引。

【讨论】:

  • 如果我为多列添加索引,并且如果有任何查询调用与一列相关,那么那个索引也会正常工作吗?
  • @django 。 . .我不明白你的评论。多列索引可用于不使用所有列的查询。列从左到右使用。
  • 例如,我为此inventory_histories(inventory_id,location_id,id,reference_id)添加了索引,如果我调用查询是“select * from inventory_histories where inventory_id = 2 and location_id = 55”所以这次那个索引会起作用吗?因为我们为 3 列添加了它,对吗?
  • 好的,我添加了多个列索引inventory_histories(inventory_id, location_id, id, reference_id),所以减少到1,我还要问你一件事,添加索引是否可以是一个大数据库吗?
  • @djano - 如果向大型数据库添加索引是一个普遍的坏主意,那么它们将毫无意义。
猜你喜欢
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 2014-02-18
  • 2016-10-06
  • 2015-02-06
相关资源
最近更新 更多