唯一索引需要回表吗

这个解释合理 :+1:

:+1: :+1: :+1:

1 个赞

能举个例子吗

发现我对点查的理解有点偏差哈哈,和 IndexLookup混淆了, Point_Get只有唯一键有,当然了主键也是唯一键的一种

主键就是唯一索引加非空约束

1 个赞

image
这个回答比较靠谱,是否回表,得看是否覆盖到这个

首先是聚簇表,还要分清主键和唯一键,主键过滤不需要,唯一键做不到

需要的

一个简单的办法就是看一下查询走的索引是否包含了select部分所有的字段,请了解一下“全覆盖索引”。

如果覆盖了字段,就不需要回标

唯一索引不是主键,select * 肯定要回表,要不数据从哪里取

索引里面有要查询的列就不要回表,直接取出来了,没有就要回表

看来是各有各的理解啊,学习了

要回的。

1 个赞

对Point_Get的访问原理不太了解 ,有没有大佬清楚的?
题主这个查询按MySQL的经验是要回表的,TiDB官方文档没搜索到回表概念:

explain select age from user1 where age=10;不需要回表 另外age不可能建唯一索引,这个例子不好。

tikv是kv数据库,能直接算出来key那就是Point_Get

那为什么非唯一索引走的IndexRangeScan。
根据官方文档说法,唯一索引结构是这样的:

Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue
Value: rowID

非唯一索引结构是这样的:

Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue_rowID
Value: null

都能根据索引算出rowID。

看你的select语句后面的字段,你的语句时“select *” 代表你想要查询所有的字段,你的age字段虽然是唯一索引,但是这个索引只有age这一个字段,跟你想要的“所有字段”不相符,所以还是需要回表捞取其他字段

Point_Get只唯一索引和主键索引获得key的