在Mysql中,什么是回表,什么是覆盖索引,索引下推?

本文详细介绍了Mysql中回表查询的概念,解释了何时会发生回表以及如何通过主键查询避免回表。接着讨论了索引覆盖的原理及其优势,提供了解决方案来实现索引覆盖。此外,还探讨了如何创建有效的索引,包括前缀索引、多列索引和选择合适的索引列顺序。最后,文章阐述了索引下推优化(ICP)如何减少回表次数,提高查询性能。
摘要由CSDN通过智能技术生成

一、什么是回表查询?

通俗的讲就是,如果索引的列在 select 所需获得的列中(因为在 mysql 中索引是根据索引列的值进行排序的,所以索引节点中存在该列中的部分值)或者根据一次索引查询就能获得记录就不需要回表,如果 select 所需获得列中有大量的非索引列,索引就需要到表中找到相应的列的信息,这就叫回表。

InnoDB聚集索引的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引:

(1)如果表定义了主键,则PK就是聚集索引;
(2)如果表没有定义主键,则第一个非空唯一索引(not NULL unique)列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;

先创建一张表,sql 语句如下:

create table xttblog(
    id int primary key, 
    k int not null, 
    name varchar(16),
    index (k)
)engine = InnoDB;

然后,我们再执行下面的 SQL 语句,插入几条测试数据。

INSERT INTO xttblog(id, k, name) VALUES(1, 2, 'xttblog'),
    (2, 1, '业余草'),
    (3, 3, '业余草公众号');

假设,现在我们要查询出 id 为 2 的数据。那么执行 select * from xttblog where ID = 2; 这条 SQL 语句就不需要回表。原因是根据主键的查询方式,则只需要搜索 ID 这棵 B+ 树。主键是唯一的,根据这个唯一的索引,MySQL 就能确定搜索的记录。

但当我们使用 k 这个索引来查询 k = 2 的记录时就要用到回表。select * from xttblog where k = 2; 原因是通过 k 这个普通索引查询方式,则需要先搜索 k 索引树,然后得到主键 ID 的值为 1,再到 ID 索引树搜索一次。这个过程虽然用了索引,但实际上底层进行了两次索引查询,这个过程就称为回表。

也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。

我这里表里的数据量比较少,如果数据量大的话,你能很明显的看出两次查询所用的时间,很明显使用主键查询效率更高。

更多如下图:

(1)先通过普通索引定位到主键值id=5;
(2)在通过聚集索引定位到行记录;

这就是所谓的回表查询,先定位主键值,再定位行记

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL的索引有多种类型,常见的包括: 1. B-Tree索引是一种常见的索引类型,用于等值查找和范围查询。它通过将索引键值按顺序存储在B-Tree数据结构,以提供高效的查找和排序。 2. 哈希索引:适用于等值查找,但不支持范围查询。它将索引键值计算为哈希值,并将其存储在哈希表,以实现快速的查找操作。 3. 全文索引:用于对文本内容进行全文搜索。它可以在文本查找关键词,并返回匹配的结果。 4. 空间索引:用于支持空间数据类型的查询,例如地理位置数据。 关于索引的结构,常见的是B-Tree索引结构。B-Tree索引使用平衡树的数据结构,其每个节点存储多个索引键值,并按照键值的顺序进行排序。这种结构使得在查找、插入和删除操作时能够高效地定位到目标数据。 回表(Index Lookups)是指当使用非聚集索引进行查询时,如果需要获取其他列的数据,则需要通过回表操作访问主索引或聚集索引来获取完整的行数据。这会增加额外的IO开销。 覆盖索引(Covering Index)是指查询所需的数据可以完全通过索引来获取,而不需要回表操作。当查询只需要索引列的数据时,通过覆盖索引可以减少IO开销,提高查询性能。 索引下推(Index Condition Pushdown)是MySQL 5.6版本引入的优化技术。它可以在B-Tree索引对谓词进行评估,并尽可能地减少回表操作。通过将索引列上的谓词下推到存储引擎层,在索引上进行过滤,可以减少不必要的IO开销和数据传输。 这些索引类型和结构的选择和使用会对MySQL查询性能产生重要影响,根据具体的业务需求和查询模式,选择合适的索引类型和优化策略是提高MySQL性能的关键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值