为什么我的postgresql查询很慢?为什么这些查询没有利用索引?

参与3

1同行回答

努力呀努力呀  数据库运维工程师 , XX
并非每个查询都会自动使用索引。只有在表的大小超过一个最小值,并且查询只会选中表中较小比例的记录时才会采用索引。 这是因为索引扫描引起的随即磁盘存取可能比直接地读取表(顺序扫描)更慢。为了判断是否使用索引, PostgreSQL 必须获得有关表的统计值。这些统计值可以使用 ...显示全部

并非每个查询都会自动使用索引。只有在表的大小超过一个最小值,并且查询只会选中表中较小比例的记录时才会采用索引。 这是因为索引扫描引起的随即磁盘存取可能比直接地读取表(顺序扫描)更慢。

为了判断是否使用索引, PostgreSQL 必须获得有关表的统计值。这些统计值可以使用 VACUUM ANALYZE ,或 ANALYZE 获得。 使用统计值,优化器知道表中有多少行, 就能够更好地判断是否利用索引。 统计值对确定优化的连接顺序和连接方法也很有用。在表的内容发生变化时,应定期进行统计值的更新收集。

索引通常不用于 ORDER BY 或执行连接。对一个大表的一次顺序扫描再做一次排序通常比索引扫描要快。然而,如果将 LIMIT 和 ORDER BY 结合在一起使用的话,通常将会使用索引,因为这时仅返回表中的一小部分记录。

如果你确信 PostgreSQL 的优化器使用顺序扫描是不正确的,你可以使用 SETenable_seqscan TO 'off' 指令来关闭顺序扫描, 然后再次运行查询,你就可以看出使用一个索引扫描是否确实要快一些。

当使用通配符操作,例如 LIKE 或 ~ 时,索引只能在特定的情况下使用:

字符串的开始部分必须是普通字符串,也就是说:

LIKE 模式不能以 % 打头。

~ (正则表达式)模式必须以 ^ 打头。

字符串不能以匹配多个字符的模式类打头,例如 [a-e] 。

大小写无关的查找,如 ILIKE 和 ~* 等不使用索引,但可以用 4.8 节描述的表达式索引。

在做 initdb 时必须采用缺省的本地设置 C locale ,因为系统不可能知道在非 C locale 情况时下一个最大字符是什么。 在这种情况下,你可以创建一个特殊的 text_pattern_ops 索引来用于 LIKE 的索引。

收起
银行 · 2020-01-07
浏览1408

提问者

yuansuiyun
数据库架构师LL

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2020-01-06
  • 关注会员:2 人
  • 问题浏览:2046
  • 最近回答:2020-01-07
  • X社区推广