【问题标题】:PostgreSQL: GIN or GiST indexes?PostgreSQL:GIN 还是 GiST 索引?
【发布时间】:2008-08-22 05:22:39
【问题描述】:

从我能找到的信息来看,它们都解决了相同的问题——更深奥的操作,如数组包含和交集(&&、@>、 PostgreSQL documentation 有一些关于此的信息:

  • GIN 索引查找比 GiST 快大约三倍
  • GIN 索引的构建时间大约是 GiST 的三倍
  • GIN 索引的更新速度比 GiST 慢十倍
  • GIN 索引比 GiST 大两到三倍

但是,我特别想知道当内存与索引大小的比率开始变小时(即索引大小变得比可用内存大得多)是否会对性能产生影响?我在#postgresql IRC 频道上被告知 GIN 需要将所有索引保存在内存中,否则它不会有效,因为与 B-Tree 不同,它不知道从磁盘读取哪个部分一个特定的查询?问题是:这是真的吗(因为我也被告知相反的情况)? GiST 有同样的限制吗?在使用其中一种索引算法时,我还应该注意其他限制吗?

【问题讨论】:

  • 这些测量值因您使用的 PG 版本而异。我刚刚在 9.6.1 下针对 hstore 列进行了测试,得到以下结果:GiST 的构建时间比 GIN 长 4.1 倍,查找速度慢了大约 170 倍。甚至不接近你引用的数字。

标签: postgresql indexing gwt-gin gist-index


【解决方案1】:

首先,您需要将它们用于文本搜索索引吗? GIN 和 GiST 是专门针对某些数据类型的索引。如果您需要索引简单的字符或整数值,那么普通的 B-Tree 索引是最好的。
无论如何,PostgreSQL 文档有一章关于 GIST 和一章关于 GIN,您可以在其中找到更多信息。
最后但并非最不重要的一点是,找到最好的方法是生成样本数据(尽可能多地成为真实场景),然后创建 GIST 索引,测量创建索引需要多少时间,插入一个新值,执行一个示例查询。然后删除索引并对 GIN 索引执行相同操作。根据您的数据比较这些值,您将得到所需的答案。

【讨论】:

  • 是的,但问题是时间,如果有人已经知道,最好问一下......
  • 我认为生成您自己的数据是唯一的答案。我花了几天时间在全文和空间的上下文中阅读所有关于 gist 和 gin 索引的内容,使用索引打开或关闭插入,postgres.sql 中的 wal 设置,并在#postgis/#postgresql 上与人们交谈,最终来了得出的结论是,对于我非常具体的用法,唯一可以确定的方法是使用我的实际数据的大子集加载测试表,然后进行测试。如果您在设置过程中急于在这里或那里节省一天,那么您将在接下来的几年中浪费数周时间,我从艰苦的经验中学到了。
猜你喜欢
  • 2019-07-12
  • 2013-12-23
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
相关资源
最近更新 更多