当前位置:首页 > 技术分析 > 正文内容

某滴一面:什么是回表查询、索引覆盖、最左匹配原则?

ruisui884周前 (04-01)技术分析9

面试官:什么是回表查询、索引覆盖、最左匹配原则?聚集索引、非聚集索引的区别?

候选人:

1. 问题理解

  • 回表查询:当查询需要的数据不在索引中时,数据库需要回到表中查找完整的数据,这个过程称为回表查询。
  • 索引覆盖:如果查询所需的所有数据都可以通过索引直接获取,而不需要回表查询,这种情况称为索引覆盖。
  • 最左匹配原则:在使用复合索引时,查询条件必须从索引的最左边的列开始匹配,才能有效利用索引。
  • 聚集索引与非聚集索引:聚集索引是按照索引顺序存储数据的索引,而非聚集索引是单独存储索引信息,数据存储在其他位置。

2. 回表查询

2.1 通俗解释

  • 假设你有一个图书馆,书架上的书是按照作者名字排序的(这就是索引)。如果你要找一本“鲁迅”写的书,你可以直接在“鲁迅”的区域找到书(这就是索引查询)。但如果书架上只记录了书名和作者,而你要找的是书的出版年份,你就需要找到书后再翻开书查看出版年份(这就是回表查询)。

2.2 示例 假设有一个表users,包含字段id、name、age,并且有一个索引idx_name在name字段上。

sql复制

SELECT id, name FROM users WHERE name = 'John';

这个查询可以直接通过索引idx_name找到id和name,不需要回表查询。

但如果查询是:

sql复制

SELECT id, name, age FROM users WHERE name = 'John';

那么在通过索引找到name为John的记录后,还需要回到表中查找age字段,这就是回表查询。

3. 索引覆盖

3.1 通俗解释

  • 索引覆盖就是查询所需的所有信息都可以在索引中直接找到,不需要回表查询。就像你在图书馆可以直接通过作者名字找到书名,而不需要翻开书查看其他信息。

3.2 示例 继续上面的例子,如果查询是:

sql复制

SELECT name FROM users WHERE name = 'John';

这个查询只需要通过索引idx_name就可以找到所有需要的信息,这就是索引覆盖。

4. 最左匹配原则

4.1 通俗解释

  • 最左匹配原则是指在复合索引中,查询条件必须从索引的最左边的列开始匹配,才能有效利用索引。就像你有一个书架,书是按照作者名字和书名排序的,你必须先按作者名字查找,才能按书名查找。

4.2 示例 假设有一个表users,包含字段id、name、age,并且有一个复合索引idx_name_age在name和age字段上。

sql复制

SELECT * FROM users WHERE name = 'John' AND age = 25;

这个查询可以有效利用复合索引idx_name_age,因为查询条件从索引的最左边的列name开始匹配。

但如果查询是:

sql复制

SELECT * FROM users WHERE age = 25;

这个查询无法有效利用复合索引idx_name_age,因为查询条件没有从索引的最左边的列name开始匹配。

5. 聚集索引与非聚集索引的区别

5.1 聚集索引

  • 定义:聚集索引是按照索引顺序存储数据的索引。在MySQL的InnoDB存储引擎中,表数据本身是按照主键索引存储的,主键索引就是聚集索引。
  • 特点
  • 数据存储顺序与索引顺序一致。
  • 每个表只能有一个聚集索引。
  • 查询效率高,因为数据存储在一起。

5.2 非聚集索引

  • 定义:非聚集索引是单独存储索引信息,数据存储在其他位置。在MySQL中,除了主键索引外的其他索引都是非聚集索引。
  • 特点
  • 索引和数据分开存储。
  • 可以有多个非聚集索引。
  • 查询时可能需要回表查询。

5.3 示例 假设有一个表users,包含字段id(主键)、name、age,并且有一个非聚集索引idx_name在name字段上。

  • 聚集索引查询
  • sql复制
  • SELECT * FROM users WHERE id = 1;
  • 这个查询直接通过主键索引(聚集索引)找到数据,效率很高。
  • 非聚集索引查询
  • sql复制
  • SELECT * FROM users WHERE name = 'John';
  • 这个查询通过非聚集索引idx_name找到name为John的记录,但需要回表查询其他字段。

6. 总结

  • 回表查询:查询需要的数据不在索引中时,需要回到表中查找完整的数据。
  • 索引覆盖:查询所需的所有数据都可以通过索引直接获取,不需要回表查询。
  • 最左匹配原则:查询条件必须从索引的最左边的列开始匹配,才能有效利用索引。
  • 聚集索引与非聚集索引:聚集索引是按照索引顺序存储数据的索引,非聚集索引是单独存储索引信息,数据存储在其他位置。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3214.html

标签: 查看表索引
分享给朋友:

“某滴一面:什么是回表查询、索引覆盖、最左匹配原则?” 的相关文章

vue3中父子组件之间传值的详解

首先我们回顾一下vue2中父子组件是怎么传值的,然后对比vue3进行详解。一、vue2中父子组件传值<!-- 父组件 --> <template> <div> // name:父组件把值传给子组件test-child // childFn:...

快速上手React

web前端三大主流框架1、Angular大家眼里比较牛的框架,甚至有人说三大框架中只有它能称得上一个完整的框架,因为它包含的东西比较完善,包含模板,数据双向绑定,路由,模块化,服务,过滤器,依赖注入等所有功能。对于刚开始学习使用框架的小伙伴们,可以推荐这个框架,学会之后简直能颠覆之前你对前端开发的认...

Java教程:gitlab-使用入门

1 导读本教程主要讲解了GitLab在项目的环境搭建和基本的使用,可以帮助大家在企业中能够自主搭建GitLab服务,并且可以GitLab中的组、权限、项目自主操作GitLab简介GitLab环境搭建GitLab基本使用(组、权限、用户、项目)2 GitLab简介GitLab是整个DevOps生命周期...

GitLab 14.6发布,优化Geo高可用,安全更新等

昨天,GitLab官方按照管理发布了有一个月度版本GitLab 14.6的发布,这也是本年度收官版本。14.6中在安全合规性方面,在Geo方面以及MD代码块一键复制等方便做了优化,另外还在UI图标方面发布了一套全新的图标。详细情况请和虫虫一起学习。GitLab 14.6主要改进使用 Geo 实现无缝...

迁移GIT仓库并带有历史提交记录

迁移git仓库开发在很多时候,会遇到一个问题。GIT仓库的管理,特别是仓库的迁移。我需要保留已有的历史记录,而不是重新开发,重头再来。我们可以这样做:使用--mirror模式会把本地的分支都克隆。// 先用--bare克隆裸仓库 git clone git@gitee.com:xxx/testApp...

快速掌握 Git:程序员必会的版本控制技巧

在现代软件开发中,版本控制系统(VCS)是开发人员不可或缺的工具。无论是个人项目,还是多人协作的团队开发,良好的版本控制都能确保代码管理的高效性与稳定性。而在版本控制系统中,Git 凭借其分布式、灵活性和高效性,成为了最流行的工具之一。几乎所有的开发团队都在使用 Git 来管理代码版本、协作开发和追...