-
什么是回表
-
怎么避免回表
什么是回表?
简单来说就是数据库根据索引找到了指定的记录所在行后,还需要根据rowid再次到数据块里取数据的操作;
示例:基本表结构与索引情况如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
create
table
MOB_ANALYZE_NAME
(
PHONETYPE VARCHAR2(100),
TYPENAME VARCHAR2(500)
;
--这时候还没有索引 访问数据块为 是全表扫描 效率肯定不行
select
a.phonetype
from
mob_analyze_name a
where
a.phonetype =
'zg_20090611_00057'
;
--加入索引
create
index
IDX_MOB_ANALYZE_NAME_ID
on
MOB_ANALYZE_NAME (PHONETYPE);
--该语句不会回表 从索引块里就可取出全部数据
select
a.phonetype
from
mob_analyze_name a
where
a.phonetype =
'zg_20090611_00057'
;
--该语句取得数据行rowid后 将会根据rowid回表查询出typename,因为有两行,就回表多查了2个数据块
--此处遗留一个问题是 一行数据是否有可能放到两个数据块里,那是不是可能会出现本来查询一行数据 就多访问两个数据块
select
a.typename
from
mob_analyze_name a
where
a.phonetype =
'zg_20090611_00057'
;//2行
|
怎么避免回表?
如果只是简单的查询name id 这种情况 可以考虑创建组合索引 要根据实际情况考虑创建索引的成本!
1
2
|
drop
index
IDX_MOB_ANALYZE_NAME_ID ;
create
index
IDX_MOB_ANALYZE_NAME_ID_NAME
on
MOB_ANALYZE_NAME (PHONETYPE, TYPENAME);
|