问题标签 [covering-index]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
995 浏览

sql - 为什么 PostgreSQL 在这个查询中不使用 *just* 覆盖索引取决于它的 IN() 子句的内容?

我有一个带有覆盖索引的表,它应该只使用索引来响应查询,而不需要检查表。事实上,如果 IN() 子句中有 1 个或几个元素,Postgres 会这样做。但是,如果 IN 子句有很多元素,它似乎是在索引上进行搜索,然后去表并重新检查条件......

我不明白为什么 Postgres 会这样做。它可以直接从索引提供查询,也可以不提供,如果它(理论上)没有其他要添加的内容,为什么要进入表?

桌子:

我正在运行的查询是:

如您所见,索引具有回复该查询所需的所有字段。

如果我在 IN 子句中只有一个或几个数字,它会:

1个号码:

在 phone_numbers 上使用 index_phone_numbers_on_hashed_phone_number 进行索引扫描(成本=0.41..8.43 行=1 宽度=4)
  索引条件:((hashed_phone_number)::text = 'bebd43a6eb29b2fda3bcb63dcc7ffaf5433e78660ccd1a495c1180a3eaaf6b6a'::text)
  过滤器:“

3个数字:

Index Only Scan using index_phone_numbers_covering_hashed_ghost_and_user on phone_numbers (cost=0.42..17.29 rows=1 width=4)
  Index Cond: ((hashed_phone_number = ANY ('{8228a8116f1fdb12e243102cb85ecd859ebf7873d9332dce5f1343a481ec72e8,43ddeebdca2ea829d468d5debc84d475c8322cf4bf6edca286c918b04216387e,1578bf773eb6eb8a9b57a130922a28c9c91f1bda67202ef5936b39630ca4cfe4}'::text[])) AND (.. .)
  过滤器:(不是幽灵)”

但是,当我在 IN 子句中有很多数字时,Postgres 正在使用索引,但随后击中表,我不知道为什么:

Bitmap Heap Scan on phone_numbers (cost=926.59..1255.81 rows=106 width=4) Recheck
  Cond: ((hashed_phone_number)::text = ANY ('{b6459ce58f21d99c462b132cce7adc9ea947fa522a3849321e9fb65893006a5e,8228a8116f1fdb12e243102cb85ecd859ebf7873d9332dce5f1343a481ec72e8,ab3554acc1f287bb2e22ff20bb855e19a4177ef552676689d217dbb2a1a6177b,7ec9f58 (...)
  Filter: (NOT ghost)
  -> Bitmap Index Scan on index_phone_numbers_covering_hashed_ghost_and_user (cost=0.00..926.56 rows=106 width=0)
        Index Cond: (((hashed_phone_number)::text = ANY ('{b6459ce58f21d99c462b132cce7adc9ea947fa522a3849321e9fb65893006a5e,8228a8116f1fdb12e243102cb85ecd859ebf7873d9332dce5f1343a481ec72e8,ab3554acc1f287bb2e22ff20bb855e19a4177ef552676689d217dbb2a1a6177b,7e (... )

当前正在执行此查询,该查询在总行数为 50k 的表中查找 250 条记录,大约是在另一个表上查找类似查询的两倍,后者在具有 500 万行的表中查找 250 条记录,而不是很有意义。

任何想法可能会发生什么,以及我是否可以做任何事情来改善这一点?


更新:将覆盖索引中的列顺序更改为先显示重影,然后再使用 hashed_phone_number 也不能解决问题:

Bitmap Heap Scan on phone_numbers (cost=926.59..1255.81 rows=106 width=4) Recheck
  Cond: ((hashed_phone_number)::text = ANY ('{b6459ce58f21d99c462b132cce7adc9ea947fa522a3849321e9fb65893006a5e,8228a8116f1fdb12e243102cb85ecd859ebf7873d9332dce5f1343a481ec72e8,ab3554acc1f287bb2e22ff20bb855e19a4177ef552676689d217dbb2a1a6177b,7ec9f58 (...)
  Filter: (NOT ghost)
  -> Bitmap Index Scan on index_phone_numbers_covering_ghost_hashed_and_user (cost=0.00..926.56 rows=106 width=0)
        Index Cond: ((ghost = false) AND ((hashed_phone_number)::text = ANY ('{b6459ce58f21d99c462b132cce7adc9ea947fa522a3849321e9fb65893006a5e,8228a8116f1fdb12e243102cb85ecd859ebf7873d9332dce5f1343a481ec72e8,ab3554acc1f287bb2e22ff20bb855e19a4177ef55267668 (...)

0 投票
1 回答
365 浏览

php - 在mysql中覆盖索引和两个表

我有两个正在比较的表(NewProducts 和 OldProducts)。NewProducts 有大约 68,000 条记录,OldProducts 大约有 51,000 条记录。我在每个表上都使用了覆盖索引,但是查询需要 20 分钟才能执行,所以我没有正确使用它。覆盖索引真的适用于多个表吗?我究竟做错了什么?谢谢你。

这是我的查询代码和索引:

0 投票
2 回答
422 浏览

mysql - MySQL select 看起来很慢但是想不出怎么改进?

我有一个有四列的表......

id是唯一的主键。其他列不是唯一的。

我想返回具有特定tidcid值并按名称排序的所有id值的列表。所以这...

表中有大约 125k 条记录,并且应该有大约 50k 条恰好符合此条件。所有四列都有单独的索引。

在我的机器上,查询运行大约需要 140 毫秒。我需要把它降低到大约 20 毫秒或更好。我认为解决方案是添加一个新的覆盖索引,该索引按cidtid和 name 的顺序定义。虽然没有任何区别。

有任何想法吗?我的覆盖指数是否设置不正确?

0 投票
2 回答
174 浏览

sqlite - sqlite:唯一覆盖索引

假设我有一个包含三列 A、B、C 的表 t1,其中 (A,B) 包含一个唯一键(具有数十万行)。由于 90% 的查询将采用 SELECT C FROM t1 WHERE A=? 和 B =?,我想我想要 A、B 和 C 的覆盖索引。

如何拥有包含 C 并将 (A,B) 定义为唯一的覆盖索引?

我正在考虑拥有两个索引:一个唯一索引和一个覆盖索引,并使用 INDEXED BY 强制选择覆盖索引。

这合理吗?

0 投票
1 回答
366 浏览

indexing - 列存储索引多少列

我有一个有 7 列的表。用户可能希望这些列中的任何一个用于查询。所以我要为所有 7 列创建一个列存储索引。这是一个合理的计划吗?还是为所有列创建有问题?

0 投票
0 回答
40 浏览

mysql - MySQL涵盖索引优化?

我有一个具有以下结构的表:

我希望为此 SELECT 查询创建一个覆盖索引:

我了解覆盖索引会删除磁盘 I/O 的数量,因为索引存储在内存缓存中,从而提高了性能。

对于我的 SELECT 查询,我是否正确地说,由于 WHERE 子句需要访问 Telephone_Number 值,所以将 Id 设为索引不会消除对磁盘 I/O 的需求?

如果是这样,综合指数是否(Id, Telephone_Number)可以作为覆盖指数?还是覆盖索引必须是单列的?

0 投票
1 回答
154 浏览

sql-server - 非聚集主键和覆盖索引在性能方面的区别

我有一个包含非聚集主键的表。我打算删除这个主键并在同一列上创建一个唯一的覆盖索引。

那么该表将没有主键,而是一个唯一的覆盖索引。

我搜索了谷歌,但找不到相关主题。这从根本上是错误的吗?或者没关系。

更新:

为什么我需要将此索引转换为覆盖索引?

因为这是主键,我有很多基于这个键的选择查询。目前,对于每个选择,都需要 RID 查找,因为这是一个 NONE 聚集键。如果我将它转换为覆盖索引,那么对于那些选择查询,这个 RID 查找将消失,并且希望会有更好的性能(至少执行计划是这样说的)。

当然,完整性也是意料之中的,这就是我将其设为唯一覆盖索引的原因。主键是唯一标识符。

我想知道的是,这是否会对其他任何事情产生负面影响。

之前的执行计划:

在此处输入图像描述

之后的执行计划:

在此处输入图像描述

0 投票
1 回答
2005 浏览

sql - 为什么即使使用仅索引扫描 PostgresQL 计数也如此缓慢

我有一个可以使用仅索引扫描的简单计数查询,但在 PostgresQL 中仍然需要很长时间!

我有一个cars有 2 列的表,type bigint并且active boolean我在这些列上也有一个多列索引

我插入了一些带有 950k 记录的测试数据,type=1 有 600k 记录

让我们运行 VACUUM ANALYZE 并强制 PostgresQL 使用 Index Only Scan

好的,我有一个简单的type查询active

结果:

查看查询解释结果,

  • 它使用Index Only Scan,仅索引扫描,取决于visibilities map,PostgresQL 有时需要获取表堆来检查元组的可见性,但我已经运行VACUUM ANALYZE所以你可以看到Heap fetch = 0,所以读取索引足以回答这个查询。

  • 索引的大小非常小,可以全部放在 Buffer cache ( Buffers: shared hit=2806) 上,PostgresQL 不需要从磁盘获取页面。

从那里,我无法理解为什么 PostgresQL 需要那么长时间(4.5s)来回答查询,1M 记录并不是很多记录,所有内容都已经缓存在内存中,并且索引上的数据是可见的,它不需要获取堆。

x86_64-pc-linux-gnu 上的 PostgreSQL 9.5.10,由 gcc 编译(Debian 4 在此处输入代码.9.2-10)4.9.2,64 位

我在 docker 17.09.1-ce,Macbook pro 2015 上对其进行了测试。

我对 PostgresQL 还是新手,并试图将我的知识与真实案例相结合。非常感谢,

0 投票
2 回答
118 浏览

sql-server - 覆盖索引如何满足多个查询?

我继承了 Azure 中托管的 MS Sql 数据库。寻找性能改进,我一直在阅读很多关于索引和覆盖索引的内容。(也许这是我发现的最完整的阅读:https ://www.red-gate.com/simple-talk/sql/learn-sql-server/using-covering-indexes-to-improve-query-性能/ )

但仍有一个疑问...

因此,例如,对于下面的计费表(大约有 800 万行),我发现查询的 where 子句中使用最多的字段是(是否在连接内): PAYMENT_DATE, DUE_DATE, CUSTOMER_ID, DELAY_DAYS, AMOUNT

此外,用于优化的目标查询对 select 子句进行计算: AMOUNT, DELAY_DAYS, COUNT(ID). 例如:

因此,在我看来,以下索引可以解决我的所有问题:

相反,当我在 Management Studio 上询问查询计划时,SQL Server 不使用此索引并建议我创建一个新索引:

所以,疑问是:
覆盖索引是否需要正是 WHERE 子句搜索的内容?
如果是真的,覆盖索引如何满足多个查询?
否则,为什么以前的索引不满足查询?

我真的不知道我错过了什么......

提前致谢!

0 投票
0 回答
17 浏览

configuration - 在 Oracle Sql Developer (Data Modeller) 版本 4.1.5.21 中应如何配置 MSSql 覆盖索引

有人可以帮助我了解如何在 Oracle Sql Developer(Data Modeller)版本 4.1.5.21 中配置覆盖索引(INCLUDE 选项)。我只能找到创建普通索引或使用“索引表达式”的选项,我们可以直接放置索引脚本。

目标是使用工具本身来构建覆盖索引,例如,如果我们对列名进行更改,这会在创建 ddl 时自动反映在索引中。

谢谢莫伊纳克罗伊