Mysql数据库中什么是回表 - 面试宝典

举报
皮牙子抓饭 发表于 2023/07/28 09:15:20 2023/07/28
【摘要】 ​Mysql数据库中的"回表"是指当查询语句需要获取的数据不仅仅在索引中,还需要回到主表中进行二次查询获取的过程。这种情况通常发生在使用非聚簇索引进行查询时。 示例代码如下: 假设我们有一个用户表​​users​​,其中包含id、name和age三个字段,其中id是主键,并且有一个非聚簇索引idx_name(name)。 首先,创建用户表:sqlCopy codeCREATE TABLE `...

Mysql数据库中的"回表"是指当查询语句需要获取的数据不仅仅在索引中,还需要回到主表中进行二次查询获取的过程。这种情况通常发生在使用非聚簇索引进行查询时。 示例代码如下: 假设我们有一个用户表​​users​​,其中包含id、name和age三个字段,其中id是主键,并且有一个非聚簇索引idx_name(name)。 首先,创建用户表:

sqlCopy codeCREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`)
) ENGINE=InnoDB;

然后,向用户表中插入一些数据:

sqlCopy codeINSERT INTO `users` (`name`, `age`) VALUES
('Tom', 20),
('Jerry', 25),
('Alice', 30),
('Bob', 35),
('John', 40);

接下来,我们进行一个查询,需要获取name为'Tom'的用户的age:

sqlCopy codeSELECT `age` FROM `users` WHERE `name` = 'Tom';

在这个查询中,Mysql会首先使用索引idx_name(name)快速定位到name为'Tom'的行,然后再回到主表中获取对应行的age字段的值,这个过程就是回表。 回表的过程会产生额外的IO操作,降低查询的性能。为了减少回表操作,可以考虑将需要查询的字段(如age)加入到索引中,这样查询语句就可以直接从索引中获取到需要的数据,而不需要回表。例如,可以将索引idx_name(name)修改为包含age字段:

sqlCopy codeALTER TABLE `users` ADD INDEX `idx_name_age` (`name`, `age`);

这样,在查询name为'Tom'的用户的age时,就可以直接从索引中获取数据,而无需回表。 需要注意的是,回表对于小表和查询结果集较小时,影响并不明显。但是在大表和复杂查询场景下,回表操作可能会成为性能瓶颈,需要进行优化。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。