唯一索引需要回表吗

我是新手,关于唯一索引有些疑问。
如下图:

id是主键,age是唯一键;此时使用age作为过滤条件,内核中是否需要回表?
我的理解是:投影字段是全部,唯一键无法获得全部数据,因此TiDBserver需要先去TiKV获取唯一键对应的rowid,TiDBserver拿到rowid之后再去TiKV获取全部数据。
不知道这么理解对不对?
如果是这样子的话,为什么执行计划是Point_Get,Point_Get是不是就没有回表啊?

如果 id 是主键,age 是唯一键,并且您使用 age 作为过滤条件,那么在执行查询时,TiDB 的执行计划可能会使用 Point_Get。

Point_Get 是一种查询优化策略,它可以在不进行回表操作的情况下,直接从索引中获取所需的数据。在这种情况下,TiDB 可能会使用 age 的唯一键索引来定位符合条件的行,并直接从索引中获取所需的数据,而无需进行回表操作。

具体来说,TiDB 可能会使用以下步骤来执行查询:

  1. 根据 age 的唯一键索引,定位到符合条件的行的索引位置。
  2. 从索引中获取所需的数据,包括主键 id 和其他投影字段。
  3. 返回查询结果,无需进行回表操作。

需要注意的是,执行计划的具体选择取决于多个因素,包括表的结构、索引的选择、数据分布等。因此,实际执行计划可能会根据具体情况而有所不同。

关于执行计划和查询优化的更多信息,您可以参考官方文档中的相关章节,例如 “执行计划” 和 “查询优化” 。

可以看下https://docs.pingcap.com/zh/tidb/v6.5/clustered-indexes#聚簇索引
point_get只能表示点查,跟回表与否没关系。

需要回表,where条件不是唯一索引的字段也可能是point_get

好的 感谢

了解了,感谢

回表的

你这个是需要回表的

如果索引覆盖了要查询的列,就不需要回表

主键呢,主键作为过滤条件应该就不需要回表了吧

好的呢
主键同时也是rowid的话,就不需要回表吧?

聚簇索引(可以理解成主键就是rowid)就不需要回表了,非聚簇索引(rowid不是主键)还是需要回表的

索引如果覆盖了查询列,是不需要回表的

1 个赞

OK非常感谢。
如果主键是整数类型,那么同时也是rowid,此时用它作为过滤条件不需要回表。
如果主键是其他数据类型(不能作为rowid),与唯一索引类似,作为过滤条件的时候如果不是覆盖索引查询,那么也是需要回表的。

可以看一下聚簇索引和非聚簇索引相关章节

1 个赞

不是,说的是如果走主键唯一索引,如果是聚簇索引酒不需要回表了,非聚簇索引主键还是需要回表的
非主键的唯一索引什么表都需要回表的(索引列包含所有列除外,就会索引覆盖不需要回表)

了解了,我再去看下聚簇索引章节。
还有疑问:
如果我更新了索引字段,这个key是不是有可能从某一个region转移到另一个region?
如果是这样,那么PD以及Region Cache中的路由信息是不是就过期了?

pd的信息不会过期,pd记录的是region范围,你只是你的key不在当前region了,保存在新的region了,pd的信息记录当前region还是这个范围,你新的值就会在另一个pd的region信息里了

2 个赞

:rofl:
我真是傻了 脑子没转过来

主键要看是否是聚簇表,非聚簇表需要回表,
这也是为啥我在群里说 select name from t where name=‘lisi’ 一定不会表
没说 select name,id from t where name=‘lisi’ 一定不会表的原因

明白了 感谢
:+1:


我觉得pointget 更多强调的是返回一行数据,一条
跟回不回表没有直接的强烈关联

1 个赞