我需要优化以下查询的建议/想法:
SELECT COUNT(*)
FROM (SELECT 1
FROM f
WHERE parent_sha256 = $1
AND parent_sha256 <> sha256
LIMIT 1) AS row_count;
需要验证特定的parent_sha256是否有任何直接子代。表很大(50M行),当有700k~900k行匹配parent_sha256 = $1
但0行匹配时,查询非常慢(6-12分钟) parent_sha256 = $1 AND parent_sha256 <> sha256
。
在这种情况下,DB 必须超过 700k~900k。
值得一提的是,parent_sha256
和上都有索引sha256
。
Laurenz提供的部分指数影响巨大。
要解决“除了使用索引之外”的问题:简化复杂的查询以获得额外的微小改进。
返回
true
/false
而不是原始文件中的1
/ 。 如果/“无行”适合您:0
true
使用条件索引:
这里的技巧是,执行器不必评估代价高昂的条件
parent_sha256 <> sha256
(这需要查看满足 的所有行parent_sha256 = $1
),因为不满足条件的行parent_sha256 <> sha256
不会被索引,并且会被索引扫描自动跳过。