【发布时间】:2010-04-12 22:04:11
【问题描述】:
我正在尝试优化以下查询,但我不清楚哪种索引或索引最好。我将瓷砖存储在二维平面中并查询该平面的矩形区域。就本问题而言,该表包含以下列:
- id:主键整数
- world_id: 一个整数外键,作为瓦片子集的命名空间
- tileY:Y坐标整数
- tileX:X坐标整数
- value:此图块的内容,如果重要,则为 varchar。
我有以下索引:
- “ywot_tile_pkey”主键,btree (id)
- “ywot_tile_world_id_key”唯一,btree(world_id,“tileY”,“tileX”)
- "ywot_tile_world_id" btree (world_id)
这是我要优化的查询:
ywot=> EXPLAIN ANALYZE SELECT * FROM "ywot_tile" WHERE ("world_id" = 27685 AND "tileY" <= 6 AND "tileX" <= 9 AND "tileX" >= -2 AND "tileY" >= -1 ); QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on ywot_tile (cost=11384.13..149421.27 rows=65989 width=168) (actual time=79.646..80.075 rows=96 loops=1)
Recheck Cond: ((world_id = 27685) AND ("tileY" <= 6) AND ("tileY" >= (-1)) AND ("tileX" <= 9) AND ("tileX" >= (-2)))
-> Bitmap Index Scan on ywot_tile_world_id_key (cost=0.00..11367.63 rows=65989 width=0) (actual time=79.615..79.615 rows=125 loops=1)
Index Cond: ((world_id = 27685) AND ("tileY" <= 6) AND ("tileY" >= (-1)) AND ("tileX" <= 9) AND ("tileX" >= (-2)))
Total runtime: 80.194 ms
所以世界是固定的,我们正在查询一个矩形区域的瓷砖。一些可能相关的更多信息:
我唯一能想到的就是在 (world, X) 和 (world, Y) 上建立索引。我的猜测是数据库将能够获取这两个集合并将它们相交。问题是对于其中任何一个,都有一个 可能 无限数量的匹配项。还有其他更合适的索引吗?
【问题讨论】:
-
每个图块都有唯一的整数 (x,y)。每个世界有多少像素?
-
贾斯汀:可能无限。
标签: sql postgresql indexing