MySQL 覆盖索引(Cover Index)
概述
一个索引包含了所有需要查询的字段值,那么就称为覆盖索引。
好处
- 索引的大小通常远小于数据行大小,所以如果只需要读取索引,那么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)
覆盖索引查询
- 从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)
- 从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)
参考
- 高性能MySQL(第三版)
MySQL 覆盖索引(Cover Index)相关推荐
- MySQL覆盖索引(Covering Index)
MySQL覆盖索引(Covering Index) mysql高效索引之覆盖索引 概念 如果索引包含所有满足查询需要的数据的索引成为覆盖索引(Covering Index),也就是平时所说的不需要回表 ...
- mysql 创建覆盖索引_Mysql覆盖索引 covering index 或者 index coverage
组合索引 提到组合索引,大家都知道"最左前缀"原则.例如,创建索引 idx_name_age (name,age) ,通常情况下,where age=50 或者 where age ...
- MySQL 覆盖索引
本文主要概述mysql的覆盖索引,以及几种常见的优化场景 内容概要 聚集索引和辅助索引 什么是覆盖索引 几种优化场景 总体建议 聚集索引和辅助索引 聚集索引(主键索引) -innodb存储引擎是索引组 ...
- MySQL 覆盖索引、最左前缀原则、索引下推
1.覆盖索引 1.1 概念 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了.如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引 ...
- mysql 覆盖索引 简书_mysql覆盖索引与回表
select id,name where name='shenjian' select id,name,sex* where name='shenjian'* 多查询了一个属性,为何检索过程完全不同? ...
- 简单易懂的MySQL覆盖索引、前缀索引、索引下推
文章目录 前言 常见的索引类型 聚簇索引/非聚簇索引 覆盖索引 前缀索引 索引下推 前言 索引的出现是为了提高数据查询效率,像书的目录一样.对于数据库的表而言,索引其实就是"目录" ...
- mysql覆盖索引详解
如果一个索引包含(或覆盖)所有需要查询的字段的值,称为'覆盖索引'.即只需扫描索引而无须回表. 只扫描索引而无需回表的优点: 1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少 ...
- mysql覆盖索引解决模糊查询失效_关于MySQL的SQL优化之覆盖索引
前些天,有个同事跟我说:"我写了个SQL,SQL很简单,但是查询速度很慢,并且针对查询条件创建了索引,然而索引却不起作用,你帮我看看有没有办法优化?". 我对他提供的case进行了 ...
- Mysql 覆盖索引及其使用注意事项
一,什么叫覆盖索引 网上对覆盖索引的定义有如下三种: 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一 ...
最新文章
- jQuery 特殊选择器this
- java调用第三方的webservice应用实例
- cass方格网数据excel_讨论|CASS怎么计算回字型土方? 124
- oracle em搭建,【oracle】手动安装EM
- springboot static访问不到_Spring Boot 的静态资源处理
- Net-DataGridView
- EMI测试——CE(传导干扰)测试
- APP测试点分析与总结
- 深信服 一面 2018 秋招
- diy公益拍卖会 杨宗纬吴尊林俊杰s.h.e等拼人气
- msrcr(Multi-Scale Retinex with Color Restoration) 带色彩恢复的多尺度视网膜增强算法 整理
- MVC 音乐商店 第 7 部分: 会员资格和授权
- 万达文旅重起炉灶 王健林瞄准红色文旅
- 动态贝叶斯网络中TBN与DBN的区别
- 数字孪生城市概念分析及建设方案详解
- Excel·VBA统计表生成函数及应用实例
- CST仿真指导 | 问题类型与求解器的选择
- 测试Rockey4Smart加密锁之模块字和三算法的用法C#代码
- Intel Xeon CPU 命名规则
- Flash互动电子地图制作手册