概述

一个索引包含了所有需要查询的字段值,那么就称为覆盖索引。

好处

  • 索引的大小通常远小于数据行大小,所以如果只需要读取索引,那么MySQL会极大的减少数据访问量。
  • 索引是按照值得顺序存储的。
  • InnoDB使用聚集索引,也称为First Index,InnoDB的二级索引叶子节点中保存了行的主键值,所以如果二级索引能够覆盖查询,那么可以避免对主键索引的二次查询。

并不是所有类型的索引都是称为覆盖索引。覆盖索引必须要存储列的值,所以哈希索引、空间索引和全文索引这三类不存储列值得索引都不能作为覆盖索引,所以MySQL中只能使用B+tree索引可以做覆盖索引

当查询使用了覆盖索引,可以在EXPLAIN的Extra列看到"Using index"的信息。

实验

基于MySQL 8.0.x
表结构和索引情况:

MySQL [employees]> desc sys_user;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int          | NO   | PRI | NULL    | auto_increment |
| name        | varchar(10)  | NO   |     | NULL    |                |
| name_pinyin | varchar(255) | NO   |     | NULL    |                |
| id_card     | varchar(255) | NO   | UNI | NULL    |                |
| phone       | varchar(20)  | YES  | MUL | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
5 rows in set (0.07 sec)MySQL [employees]> show indexes from sys_user;
+----------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------------------+---------+------------+
| Table    | Non_unique | Key_name        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment             | Visible | Expression |
+----------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------------------+---------+------------+
| sys_user |          0 | PRIMARY         |            1 | id          | A         |        3494 |     NULL |   NULL |      | BTREE      |         |                           | YES     | NULL       |
| sys_user |          0 | uni_idx_id_card |            1 | id_card     | A         |        3494 |     NULL |   NULL |      | BTREE      |         | 唯一索引-身份证号         | YES     | NULL       |
| sys_user |          1 | idx_phone_name  |            1 | phone       | A         |        3493 |     NULL |   NULL | YES  | BTREE      |         | 普通索引-手机号           | YES     | NULL       |
| sys_user |          1 | idx_phone_name  |            2 | name        | A         |        3493 |     NULL |   NULL |      | BTREE      |         | 普通索引-手机号           | YES     | NULL       |
+----------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------------------+---------+------------+
4 rows in set (1.54 sec)

覆盖索引查询

  1. 从sys_user表中查询手机号和姓名
explain select phone,name from sys_user;

EXPLAIN 输出结果:

MySQL [employees]> explain select phone,name from sys_user;
+----+-------------+----------+------------+-------+---------------+----------------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys | key            | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+---------------+----------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | sys_user | NULL       | index | NULL          | idx_phone_name | 125     | NULL | 3494 |   100.00 | Using index |
+----+-------------+----------+------------+-------+---------------+----------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
  1. 从sys_user表中查询phone,name和id
explain select id, phone,name from sys_user;

EXPLAIN结果输出:

MySQL [employees]> explain select id, phone,name from sys_user;
+----+-------------+----------+------------+-------+---------------+----------------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys | key            | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+---------------+----------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | sys_user | NULL       | index | NULL          | idx_phone_name | 125     | NULL | 3494 |   100.00 | Using index |
+----+-------------+----------+------------+-------+---------------+----------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

参考

  1. 高性能MySQL(第三版)

MySQL 覆盖索引(Cover Index)相关推荐

  1. MySQL覆盖索引(Covering Index)

    MySQL覆盖索引(Covering Index) mysql高效索引之覆盖索引 概念 如果索引包含所有满足查询需要的数据的索引成为覆盖索引(Covering Index),也就是平时所说的不需要回表 ...

  2. mysql 创建覆盖索引_Mysql覆盖索引 covering index 或者 index coverage

    组合索引 提到组合索引,大家都知道"最左前缀"原则.例如,创建索引 idx_name_age (name,age) ,通常情况下,where age=50 或者 where age ...

  3. MySQL 覆盖索引

    本文主要概述mysql的覆盖索引,以及几种常见的优化场景 内容概要 聚集索引和辅助索引 什么是覆盖索引 几种优化场景 总体建议 聚集索引和辅助索引 聚集索引(主键索引) -innodb存储引擎是索引组 ...

  4. MySQL 覆盖索引、最左前缀原则、索引下推

    1.覆盖索引 1.1 概念 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了.如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引 ...

  5. mysql 覆盖索引 简书_mysql覆盖索引与回表

    select id,name where name='shenjian' select id,name,sex* where name='shenjian'* 多查询了一个属性,为何检索过程完全不同? ...

  6. 简单易懂的MySQL覆盖索引、前缀索引、索引下推

    文章目录 前言 常见的索引类型 聚簇索引/非聚簇索引 覆盖索引 前缀索引 索引下推 前言 索引的出现是为了提高数据查询效率,像书的目录一样.对于数据库的表而言,索引其实就是"目录" ...

  7. mysql覆盖索引详解

    如果一个索引包含(或覆盖)所有需要查询的字段的值,称为'覆盖索引'.即只需扫描索引而无须回表. 只扫描索引而无需回表的优点: 1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少 ...

  8. mysql覆盖索引解决模糊查询失效_关于MySQL的SQL优化之覆盖索引

    前些天,有个同事跟我说:"我写了个SQL,SQL很简单,但是查询速度很慢,并且针对查询条件创建了索引,然而索引却不起作用,你帮我看看有没有办法优化?". 我对他提供的case进行了 ...

  9. Mysql 覆盖索引及其使用注意事项

    一,什么叫覆盖索引 网上对覆盖索引的定义有如下三种: 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一 ...

最新文章

  1. jQuery 特殊选择器this
  2. java调用第三方的webservice应用实例
  3. cass方格网数据excel_讨论|CASS怎么计算回字型土方? 124
  4. oracle em搭建,【oracle】手动安装EM
  5. springboot static访问不到_Spring Boot 的静态资源处理
  6. Net-DataGridView
  7. EMI测试——CE(传导干扰)测试
  8. APP测试点分析与总结
  9. 深信服 一面 2018 秋招
  10. diy公益拍卖会 杨宗纬吴尊林俊杰s.h.e等拼人气
  11. msrcr(Multi-Scale Retinex with Color Restoration) 带色彩恢复的多尺度视网膜增强算法 整理
  12. MVC 音乐商店 第 7 部分: 会员资格和授权
  13. 万达文旅重起炉灶 王健林瞄准红色文旅
  14. 动态贝叶斯网络中TBN与DBN的区别
  15. 数字孪生城市概念分析及建设方案详解
  16. Excel·VBA统计表生成函数及应用实例
  17. CST仿真指导 | 问题类型与求解器的选择
  18. 测试Rockey4Smart加密锁之模块字和三算法的用法C#代码
  19. Intel Xeon CPU 命名规则
  20. Flash互动电子地图制作手册

热门文章

  1. ssh安装和出现的问题
  2. ❤️七夕佳节,用Python制作表白神器,程序员也应该拥有爱情!【附源码,建议收藏】❤️
  3. 命令行运行jar包的常见方式
  4. 微信公众号获取用户位置定位信息入库asp代码
  5. Java·Collection内部细剖
  6. Windows 启动 Nginx
  7. 2020年7月Github上最热门的开源项目
  8. 用python输出爱心
  9. oracle分页报未明确定义列,关于在join中出现ORA-00918: 未明确定义列的解决办法
  10. Android项目:手机安全卫士(14)—— 短信备份