【发布时间】:2021-12-17 23:03:15
【问题描述】:
我有一个表 products、一个表 orders 和一个表 orderProducts。
-
产品的名称为 PK(苹果、香蕉、芒果)和价格。
-
订单有一个 created_at 日期和一个作为 PK 的 id。
-
orderProducts 连接订单和产品,因此它们有一个 product_name 和一个 order_id。现在我想显示过去 24 小时内发生的给定产品的所有订单。
我使用以下查询:
SELECT
orders.id,
orders.created_at,
products.name,
products.price
FROM
orderProducts
JOIN products ON
products.name=orderProducts.product
JOIN orders ON
orders.id=orderProducts.order
WHERE
products.name='banana'
AND
orders.created_at BETWEEN NOW() - INTERVAL '24 HOURS' AND NOW()
ORDER BY
orders.created_at
这行得通,但我想用索引优化这个查询。这个索引需要先排序
- 产品名称,以便过滤
- 然后是订单的created_at降序排列,所以只能选择24小时前的那些
问题是,据我所见,索引只能在单个表上创建,而不能将其他表的值加入其中。由于两个单独的索引也不能解决这个问题,我想知道是否有另一种方法来优化这个特定的查询。
这里是表格脚本:
CREATE TABLE products
(
name text PRIMARY KEY,
price integer,
)
CREATE TABLE orders
(
id SERIAL PRIMARY KEY,
created_at TIMESTAMP DEFAULT NOW(),
)
CREATE TABLE orderProducts
(
product text REFERENCES products(name),
"order" integer REFERENCES orders(id),
)
【问题讨论】:
-
理想的索引策略取决于表中的数据。您可以编辑问题并在具有实际数据量的数据库上为该查询添加
EXPLAIN (ANALYZE, BUFFERS)输出吗? -
问题是这是一个更复杂的占位符问题。但作为一个比喻,大约有 100 种不同的水果类型,每个订单大约购买 4-10 种不同的水果。它的阅读频率也明显高于写入频率
-
嗯,答案可能取决于您忽略的细节。正如我所说,您的查询的执行计划会有所帮助。
-
为什么
orderProduct不包含金额/数量?为什么它没有主键? -
因为它是问题的一个例子,不需要主键或数量
标签: postgresql optimization indexing database-indexes