我是新手,关于唯一索引有些疑问。
如下图:
id是主键,age是唯一键;此时使用age作为过滤条件,内核中是否需要回表?
我的理解是:投影字段是全部,唯一键无法获得全部数据,因此TiDBserver需要先去TiKV获取唯一键对应的rowid,TiDBserver拿到rowid之后再去TiKV获取全部数据。
不知道这么理解对不对?
如果是这样子的话,为什么执行计划是Point_Get,Point_Get是不是就没有回表啊?
我是新手,关于唯一索引有些疑问。
如下图:
id是主键,age是唯一键;此时使用age作为过滤条件,内核中是否需要回表?
我的理解是:投影字段是全部,唯一键无法获得全部数据,因此TiDBserver需要先去TiKV获取唯一键对应的rowid,TiDBserver拿到rowid之后再去TiKV获取全部数据。
不知道这么理解对不对?
如果是这样子的话,为什么执行计划是Point_Get,Point_Get是不是就没有回表啊?
如果 id
是主键,age
是唯一键,并且您使用 age
作为过滤条件,那么在执行查询时,TiDB 的执行计划可能会使用 Point_Get。
Point_Get 是一种查询优化策略,它可以在不进行回表操作的情况下,直接从索引中获取所需的数据。在这种情况下,TiDB 可能会使用 age
的唯一键索引来定位符合条件的行,并直接从索引中获取所需的数据,而无需进行回表操作。
具体来说,TiDB 可能会使用以下步骤来执行查询:
age
的唯一键索引,定位到符合条件的行的索引位置。id
和其他投影字段。需要注意的是,执行计划的具体选择取决于多个因素,包括表的结构、索引的选择、数据分布等。因此,实际执行计划可能会根据具体情况而有所不同。
关于执行计划和查询优化的更多信息,您可以参考官方文档中的相关章节,例如 “执行计划” 和 “查询优化” 。
需要回表,where条件不是唯一索引的字段也可能是point_get
好的 感谢
了解了,感谢
回表的
主键呢,主键作为过滤条件应该就不需要回表了吧
好的呢
主键同时也是rowid的话,就不需要回表吧?
OK非常感谢。
如果主键是整数类型,那么同时也是rowid,此时用它作为过滤条件不需要回表。
如果主键是其他数据类型(不能作为rowid),与唯一索引类似,作为过滤条件的时候如果不是覆盖索引查询,那么也是需要回表的。
不是,说的是如果走主键唯一索引,如果是聚簇索引酒不需要回表了,非聚簇索引主键还是需要回表的
非主键的唯一索引什么表都需要回表的(索引列包含所有列除外,就会索引覆盖不需要回表)
了解了,我再去看下聚簇索引章节。
还有疑问:
如果我更新了索引字段,这个key是不是有可能从某一个region转移到另一个region?
如果是这样,那么PD以及Region Cache中的路由信息是不是就过期了?
pd的信息不会过期,pd记录的是region范围,你只是你的key不在当前region了,保存在新的region了,pd的信息记录当前region还是这个范围,你新的值就会在另一个pd的region信息里了
哇
我真是傻了 脑子没转过来
主键要看是否是聚簇表,非聚簇表需要回表,
这也是为啥我在群里说 select name from t where name=‘lisi’ 一定不会表
没说 select name,id from t where name=‘lisi’ 一定不会表的原因
明白了 感谢