美文网首页
MySQL 覆盖索引 —— by 久米泷

MySQL 覆盖索引 —— by 久米泷

作者: 久米泷 | 来源:发表于2020-06-06 23:50 被阅读0次

释义

在查询SQL中,所有的待查字段都有索引,即称为“覆盖索引”(Covering Index)。

示例

表结构:

CREATE TABLE `t_user` (
  `id` bigint(20) NOT NULL COMMENT 'PK',
  `name` varchar(16) NOT NULL COMMENT '姓名',
  `age` int(4) NULL DEFAULT 18 COMMENT '年龄',
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`)
);
  • 当执行 explain select id, name from t_user ,Extra 字段为 Using index,表示使用了覆盖索引
  • 当执行 explain select id, name, age from t_user ,Extra 字段为 NULL,因为 age 字段没有索引。

优势

由于MySQL的索引分为”聚簇索引“(Clustered Index,默认是主键)和”二级索引“(Secondary Index,也叫非聚簇索引),其中聚簇索引节点包含了所有字段数据,而二级索引节点只包含当前字段和聚簇索引字段。所以当只命中二级索引时,就会发生“回表” —— 先遍历二级索引树找到聚簇索引值,再遍历聚簇索引树找到待查字段的值。

为了解决两次遍历带来的性能损耗,覆盖索引粉墨登场。结合前文的示例,name 字段有二级索引,并且在该索引节点上也包含了聚簇索引字段 id 的值,所以无需回表就能查询到 id 和 name。


mysql-index-tree.png

应用场景

  • 大表分页:当分页查询大数据量的表时,越接近尾页会越慢,此时可以通过覆盖索引先只查询主键或有索引的字段,然后再根据索引字段查询完整数据。例如:
-- 先只查询id和name
select id, name from t_user limit 5000, 10;

-- 再完善数据
select * from t_user where id in (...);

相关文章

  • MySQL 覆盖索引 —— by 久米泷

    释义 在查询SQL中,所有的待查字段都有索引,即称为“覆盖索引”(Covering Index)。 示例 表结构:...

  • MySQL 运维 —— by 久米泷

    大表DDL MySQL在修改表字段时会锁表,如果该表数据量巨大,则会造成长时间锁表,从而引发事故。这时候就需要用到...

  • 高性能的索引策略

    MySQL查询基础-查询执行过程 MySQL聚簇索引 MySQL覆盖索引 MySQL索引扫描排序 MySQL冗余和...

  • Mysql 相关

    MySQL索引 MySQL索引背后的数据结构及算法原理 覆盖索引和回表操作 MySQL性能优化 MySql表分区详...

  • MySQL覆盖索引

    MySQL覆盖索引 1.定义: 一个索引包含(或者覆盖)所有需要查询的字段

  • mysql覆盖索引

    见:https://my.oschina.net/loujinhe/blog/1528233

  • MYSQL覆盖索引

    如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。只扫描索引而无需回表...

  • MySQL 覆盖索引

    通常大家会根据查询的 where 条件来创建合适的索引,不过这只是索引优化的一个方面。设计优秀的索引应该考虑到整个...

  • MySQL覆盖索引

    一、覆盖索引覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取...

  • MYSQL - 覆盖索引

    什么叫做覆盖索引? 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要...

网友评论

      本文标题:MySQL 覆盖索引 —— by 久米泷

      本文链接:https://www.haomeiwen.com/subject/howftktx.html