TiDB是否具有虚拟索引功能?

TiDB是否集成实现了类似PG的虚拟索引HypoPG的相关功能?

应该是没有虚拟索引。 :thinking:

目前还没有,这是什么应用场景的需求呢?

不了解PG的虚拟索引是啥样的,不知道你想说的是不是下面这个。
TiDB 生成列(虚拟列),这个虚拟列可以建索引。

生成列包括存储生成列和虚拟生成列。存储生成列会将计算得到的值存储起来,在读取时不需要重新计算。虚拟生成列不会存储其值,在读取时会重新计算。存储生成列和虚拟生成列相比,前者在读取时性能更好,但是要占用更多的磁盘空间。

无论是存储生成列还是虚拟列,都可以在其上面建立索引。

https://docs.pingcap.com/zh/tidb/stable/generated-columns#生成列的基本概念

– HypoPG 虚拟索引是一个 PostgreSQL 扩展,它提供了一种在数据库中创建和使用虚拟索引的方式。虚拟索引并不实际存储数据,而是通过在查询过程中模拟索引的行为来提高查询性能。

TiDB 无类似的功能,如果是要评估索引是否有作用,是否可以用 Invisible Indexes 近似实现?

没有,没那么实用

invisible index 也得需要先建索引,然后实则Invisible,invisible后优化器就用不上了

你们是要从 pg 迁移到 tidb 么?

嗯呢,但毕竟是没有。we are in the Mysql family

是不是除了PG,现在主流的DBMS都不支持虚拟索引的功能呢?

oracle有virtual index 其他数据库没有,看起来有点鸡肋

我觉得这个扩展功能能够避免真正建索引的overhead,还挺有用的?

不建也用不了,和没有也没区别

如果候选集合很大的话,可以用这个初步筛掉没有用的吧

先说一下答案,TiDB确实不支持这个插件,MySQL也没有这个功能。不过虽然不能模拟加索引,但是支持模拟索引不可见

另外看了一下HypoPG这个插件的功能,就是提供一个模拟索引的功能,用来校验一下索引是不是对某类查询有效。
额,怎么说呢,这个功能真的是比较鸡肋,虽然确实可以在不用真正创建索引的情况下,来验证索引是否有效。但是一般来说,索引需要注意的点其实并不多,只要找到where条件里哪个列的筛选性比较就可以了,和你逐个列创建虚拟索引是一样的效果。(其实你看这个插件的Star也就知道了,还不过千。。)

列的选择性,特别是复杂谓词,应该也很难计算吧?或者TiDB有相关的功能支撑吗?

image

@TiDBer_5MVonMJN 额,更正一下7.2其实是已经支持虚拟索引了,不过文档里还没有加上。
PS: @h5n1 发现的,我只不过想起来你问过这个问题,所以来贴一下他的实验结果

学习了

:+1:t2::+1:t2::+1:t2:

第二张截图

22c2034e34a5f62ca12bd9099e3799a