如何提高此查询的性能:
SELECT designs.* FROM designs
WHERE designs.state = 'in_stock'
ORDER BY designs.grade, id DESC
解释输出:
Sort (cost=47475.35..47591.91 rows=46621 width=763)
Sort Key: grade, id
-> Seq Scan on designs (cost=0.00..12304.20 rows=46621 width=763)
Filter: ((state)::text = 'in_stock'::text)
该表有超过250000条记录。
在state
上建立索引并没有多大帮助。
答案 0 :(得分:2)
1)将列命名为*而不是*,例如选择col1,col2 ....您是否需要所有列都在结果集中?如果不显示您需要的这些列。
2)你把索引放在哪一列?尝试索引状态并包括成绩和ID。
3)可以陈述=' in_stock'被过滤整数值并产生相同结果的东西取而代之?可以将state字段本身转换为int类型并编入索引,然后为这些整数值创建查找表吗?
答案 1 :(得分:1)
要针对给定查询进行优化(可能不是最佳策略),请使用具有匹配排序顺序的部分索引:
CREATE INDEX foo_idx ON designs (grade, id DESC) WHERE state = 'in_stock';
实际上我会先从你的表格布局开始,首先查看state
的数据类型
然后我会问你实际需要从查询中返回哪些列和行。我怀疑你需要显示结果中所有46621行的所有列吗?