【问题标题】:Can we boost the performance of COUNT, DISTINCT and LIKE queries?我们可以提高 COUNT、DISTINCT 和 LIKE 查询的性能吗?
【发布时间】:2013-04-04 16:32:16
【问题描述】:

据我了解,当我们使用COUNTDISTINCTLIKE %query%(两边都是通配符)关键字运行 SQL 查询时,无法使用索引,数据库必须进行全表扫描。

有没有办法提高这些查询的性能?

他们真的不能使用索引还是我们可以通过某种方式解决这个问题?

如果我们只需要返回一列,我们可以进行仅索引扫描吗?例如:select count(id) from MY_TABLE:可能在这种情况下,如果我们在 'id' 上有索引,我们可以进行仅索引扫描并避免命中整个表?

我的问题具有一般意义:如果我们必须使用上述运算符,您能给我一些性能指南吗?

更新 至于我,我使用 PostgreSQL。

【问题讨论】:

  • 什么关系型数据库? SQL Server 将在id(如果可用)上为select count(id) from MY_TABLE 使用更窄的索引
  • 即使没有任何条件,SELECT DISTINCT a,b FROM t; 也会使用(a,b)(b,a) 上的索引
  • 不,这只是一个例子。如果索引与您在选择中的内容匹配,则应使用它。除非当然(在这里添加一百个例外,例如):桌子太小了吗? column_name 是什么数据类型?哪个 Postgres 版本?
  • Postgres 可以使用like '%foo%'的索引
  • @MikeChristensen:带有特殊索引:depesz.com/2011/02/19/waiting-for-9-1-faster-likeilike

标签: performance postgresql count distinct sql-like


【解决方案1】:

使用 PostgreSQL,您可以为文本字符串创建 GIN pg_trgm 索引以使 LIKE '%foo%' 更快,但这需要插件和 PostgreSQL 9.1 或更高版本。

我怀疑 distinct 本身是否会使用索引。事实上,我尝试过,但无法使用它。您可以通过使用递归 CTE 将单个记录拉出(可以称为“稀疏扫描”)来强制使用索引。当从会计记录中提取个别年份时,我们会这样做。不过,这需要编写特殊查询,因此并不是真正的一般情况。

count(*) 由于 mvcc 规则,永远无法使用索引。但是,您可以通过查看相应的系统目录来获得近似结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2012-06-18
    相关资源
    最近更新 更多