postgresql - 在同一列上创建 2 个索引
问题描述
我有一个带geometry
列的表。
我在此列上有 2 个索引:
create index idg1 on tbl using gist(geom)
create index idg2 on tbl using gist(st_geomfromewkb((geom)::bytea))
我有很多使用geom
( geometry
) 字段的查询。
- 使用哪个索引?(何时以及为什么)
- 如果同一列上有两个索引(如我在此处显示的那样),
select queries
运行速度是否比仅在列上定义一个索引慢?
解决方案
索引的使用取决于索引的定义方式以及查询的调用方式。如果你SELECT <cols> FROM tbl WHERE geom = <some_value>
,那么你将使用idg1
索引。如果你SELECT <cols> FROM tabl WHERE st_geomfromewkb(geom) = <some_value>
,那么你将使用idg2
索引。
知道哪个索引将用于特定查询的一个好方法是使用EXPLAIN
(ie, EXPLAIN SELECT <cols> FROM tbl WHERE geom = <some_value>
) 调用查询——这将打印出查询计划、将使用哪些访问方法、哪些索引、哪些连接等。
对于您关于性能的问题,SELECT
查询可能会运行得更慢,因为在查询计划阶段需要考虑更多索引。在执行给定的查询计划方面,SELECT
查询不会运行得更慢,因为到那时查询计划已经建立并且已经决定使用哪个索引。
您肯定会体验到对表的性能影响INSERT
,因为所有索引都需要根据表中的更改进行更新UPDATE
。DELETE
因此,磁盘上将有额外的 I/O 活动来传播更改,从而降低数据库速度,尤其是在规模上。
推荐阅读
- google-cloud-platform - Redis(Memorystore) 清除密钥
- c++ - 是否可以在openGL中在GPU上生成几何图形并直接用于渲染
- vim - 使用在 Windows 10 cmd 行窗口中运行的 vim 复制到剪贴板
- python - 用 Python 绘制 .csv 文件
- docker - 以百分比形式获取 Docker 容器磁盘使用率
- c++ - 如何在 C++ 中运行 bash 命令而不使用 linux 中的系统
- sql-server - SSRS OLE DB 提供程序不在下拉列表中
- flutter - Flutter 空安全迁移卡在“未定义命名参数”错误
- azure - 加载并保存回文件共享
- python - sympy中线性方程组的解系统