数据库版本:PostgreSQL 12.6
我有一张有 600,000 条记录的表。
该表具有以下列:
索引:
祖先列是一种构建树的方法,其中每一行都有一个祖先,其中包含所有以“/”分隔的父 ID。
考虑以下示例:
ID | 姓名 | 祖先 |
---|---|---|
1 | 根 | 空值 |
5 | 节点 | '1' |
12 | 节点 | '1/5' |
22 | 叶子 | '1/5/12' |
以下查询需要 686 毫秒来执行:
SELECT * FROM geolocations
WHERE EXISTS (
SELECT 1 FROM geolocations g2
WHERE g2.ancestry =
CONCAT(geolocations.ancestry, '/', geolocations.id)
)
Run Code Online (Sandbox Code Playgroud)
此查询在 808 毫秒内运行:
SELECT * FROM geolocations
WHERE location_type = 2
Run Code Online (Sandbox Code Playgroud)
将两个查询与 OR 结合使用时,如果它完成,则需要大约 4475 毫秒才能完成。
SELECT * FROM geolocations
WHERE EXISTS (
SELECT 1 FROM …
Run Code Online (Sandbox Code Playgroud)