2

目前我有以下 SQL Select 语句的以下指标。尽管如此,查询对我来说似乎仍然很慢(10.000 条记录)。你有什么建议?

  1. 索引 category_id
  2. 索引交付日期
  3. product_id、product_name 上的索引

这是我的 DDL:

Create table product (    
  product_id serial,
  category_id int2,
  product_name varchar(50),
  delivery_date timestamp,
  subtitle varchar(20),
  price numeric(10,2),
  retail_price numeric(10,2),
  language_id int2,
  store_id int2,
  reseller_id int2    
);

和 SQL:

Select * 
from product 
WHERE delivery_date > '2012-10-20 06:00:00' AND category_id = 1 
ORDER BY product_id, product_name;

任何帮助,将不胜感激。

在 EXPLAIN ANALYZE 的输出下方:

Sort  (cost=18.11..18.12 rows=1 width=119) (actual time=0.064..0.064 rows=0 loops=1)
Sort Key: product_id, product_name
Sort Method: quicksort  Memory: 25kB
  ->  Seq Scan on product  (cost=0.00..18.10 rows=1 width=119) (actual time=0.019..0.019 rows=0 loops=1)
Filter: ((delivery_date > '2012-10-20 06:00:00'::timestamp without time zone) AND (category_id = 1))
Total runtime: 0.098 ms
4

1 回答 1

1

查询的绝对理想配置是为(delivery_date, category_id, product_id)or设置复合索引(category_id, delivery_date, product_id)

在实践中,只有索引(category_id, product_id)可能足以获得可接受的性能。

无论如何,EXPLAIN ANALYZE <original_query>是你最好的朋友。

还有一点需要注意:在您的查询中,ORDER BY product_id, product_name总是会得到与 simple 相同的结果ORDER BY product_id

于 2012-10-21T06:16:29.510 回答