关于回表

本文解释了数据库查询过程中的一种常见操作——回表,并通过具体示例介绍了如何通过索引获取ROWID,进而根据ROWID访问表中数据行的过程。此外,还区分了不同查询条件下是否发生回表的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在看别人的LOG时看到一个新的名词,是回表。
在这里记录下:
简单来说,通过索引访问得到表的ROWID,然后根据这些ROWID再去访问表中数据行,就称为回表
如果执行计划里出现table access by rowid说明要回表。

例子:
create table test( name char(5), id int);
create index id_test on test(id);

如果这时查询语句是:
select max(id) from test;
因为索引id_test上有关于id的信息,所以只要对索引进行查询就可以了,不用再根据ROWID查询TEST.。

如果查询
select name from test where id= 200;
那根据索引查询到ID为200的rowid后,根据rowid指向的数据,回查到TEST获得相应的NAME。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/40239/viewspace-563285/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/40239/viewspace-563285/

### Java面试中关于回表的概念及解决方法 #### 什么是回表? 在数据库查询优化中,“回表”是指当使用索引访问数据时,如果索引无法覆盖查询所需的所有字段,MySQL需要到主键索引来获取其他字段的数据。这种情况通常发生在复合索引或者二级索引的情况下[^1]。 #### 回表的原因 - **二级索引的局限性**:二级索引只包含索引列和对应的主键值,而不包含中的其他字段。因此,当查询条件涉及非索引列时,MySQL需要先通过二级索引找到主键值,然后再通过主键去聚簇索引中查找完整的记录。 - **查询需求超出索引范围**:即使存在合适的索引,但如果查询语句需要额外的字段(不在索引范围内),也会触发回表操作。 #### 如何判断是否存在回表现象? 可以通过`EXPLAIN`命令查看执行计划来确认是否有回表发生。具体现为: - 如果`type`列为`ref`或`range`,说明可能发生了回表。 - `Extra`列显示`Using index`示无需回表,因为当前索引已经满足查询需求;如果没有此提示,则可能存在回表。 #### 解决回表问题的方法 1. **创建覆盖索引** 覆盖索引指的是一个索引能够完全覆盖查询所需的字段集合。这样可以避免回表操作,提升查询性能。例如,在查询多个字段时,可以直接将这些字段加入到索引定义中[^2]。 ```sql -- 原始查询 SELECT id, name FROM users WHERE age = 25; -- 创建覆盖索引 ALTER TABLE users ADD INDEX idx_age_name (age, name); ``` 2. **调整查询逻辑** 尽量减少不必要的字段查询。如果某些字段并非必需,可以从查询语句中移除,从而降低回表的可能性。 3. **合理设计索引** 对频繁使用的查询路径建立高效的索引结构。例如,对于复杂查询场景,考虑组合索引的设计原则——左前缀匹配规则。 4. **分库分策略** 当单张规模过大导致索引效率下降时,可采用水平拆分的方式减小每张子的数据量,进而提高索引命中率并减少回表次数。 --- ### 示例代码展示如何构建覆盖索引 假设有一张用户如下: | Column Name | Data Type | |-------------|-----------| | user_id | INT | | username | VARCHAR | | email | VARCHAR | 现有查询语句为: ```sql SELECT user_id, username FROM users WHERE email = 'example@example.com'; ``` 此时可通过增加覆盖索引来消除回表: ```sql ALTER TABLE users ADD INDEX idx_email_username (email, username); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值