MySQL 的覆盖索引是什么?
MySQL 的覆盖索引是什么?
覆盖索引(Covering Index)是指索引本身包含了查询所需的所有字段数据,从而无需再回表查询的数据访问方式。这种优化能够显著提升查询性能。
1. 覆盖索引的特点
- 查询所涉及的字段都在索引中能够找到。
- 不需要访问表的聚簇索引或主键索引即可满足查询。
- 在一定程度上减少了磁盘 I/O,提升了查询效率。
2. 示例分析
(1)表结构与索引
假设有如下表结构:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(100),
KEY idx_name_age (name, age)
);
(2)覆盖索引的查询
执行以下查询:
SELECT name, age FROM users WHERE name = 'Alice';
- 过程:
- 查询需要的字段是
name和age。 - 索引
idx_name_age包含了name和age两个字段的数据。 - MySQL 可以直接通过索引完成查询,无需回表访问
users表。
- 查询需要的字段是
(3)非覆盖索引的查询
执行以下查询:
SELECT name, age, email FROM users WHERE name = 'Alice';
- 过程:
- 查询需要的字段是
name,age, 和email。 - 索引
idx_name_age不包含email。 - MySQL 通过索引
idx_name_age查找到符合条件的主键值id,然后回表查询email。
- 查询需要的字段是
3. 覆盖索引的优点
- 减少磁盘 I/O:数据直接从索引中读取,无需回表访问主表。
- 提升查询速度:索引通常比主表小,访问更高效。
- 降低存储成本:对热点查询优化有效,避免多次随机磁盘读写。
4. 覆盖索引的实现方式
- 通过索引覆盖所有查询字段:
- 将查询中涉及的所有字段添加到索引中。
示例:
CREATE INDEX idx_name_age_email ON users(name, age, email);
- 尽量减少查询的字段数量:
- 查询字段越少,索引越容易覆盖。
5. 注意事项
索引大小问题:
- 索引覆盖更多字段会占用更多磁盘空间,影响写性能。
查询字段与索引顺序:
- 查询字段的顺序应与索引设计匹配,以便 MySQL 能高效利用覆盖索引。
覆盖索引与最左前缀原则的结合:
- 查询中字段的匹配需要符合联合索引的最左前缀原则。
6. 覆盖索引的适用场景
- 高频次的读操作:如统计查询、排序等。
- 需要快速响应的查询:如分页查询。
- 涉及较少列的简单查询:减少回表次数,提升效率。
7. 总结
覆盖索引通过索引自身满足查询的所有需求,避免了回表操作,是 MySQL 中提升查询效率的重要优化手段。合理设计覆盖索引,不仅可以加速查询,还能降低系统的资源消耗。
MySQL 的覆盖索引是什么?的更多相关文章
- 理解MySQL数据库覆盖索引
话说有这么一个表: CREATE TABLE `user_group` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL, ...
- 理解MySQL数据库覆盖索引 (转)
http://www.cnblogs.com/zl0372/articles/mysql_32.html 话说有这么一个表: CREATE TABLE `user_group` ( `id` int( ...
- 【MySQL】覆盖索引和回表
先来了解一下两大类索引 聚簇索引(也称聚集索引,主键索引等) 普通索引(也成非聚簇索引,二级索引等) 聚簇索引 如果表设置了主键,则主键就是聚簇索引 如果表没有主键,则会默认第一个NOT NULL,且 ...
- mysql优化-覆盖索引查询,join
1 原始sql: SELECT a.* FROM event_data a WHERE a.receive_time >= '2018-03-28 00:00:00' AND a.receive ...
- MySQL 覆盖索引
通常大家都会根据查询的WHERE 条件来穿件合适的索引,不过这只是索引优化的一个方面.设计优秀的索引应该考虑到整个查询,而不单单是WHERE 条件部分.索引确实是一种查找数据的高效方式,但是MySQL ...
- 制作mysql大数据表验证覆盖索引
昨天跟同事聊起数据表性能的问题,能不能仅用覆盖索引实现数据的汇总统计.找了一个开发环境已有的数据表进行测试,通过explain命令,能看到mysql通过覆盖索引就能实现sum的需求,而无须去读取实际行 ...
- MySQL 创建高性能索引
索引是存储引擎用于快速找到记录的一种数据结构.除了加速查找,索引在其他方面也有一些有用的属性.索引对于良好的性能非常关键.尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要.在数据量较小且负载较 ...
- mysql延迟查询, 覆盖索引使用例子
引用自 'mysql高性能' 5.3.6章节 不能使用覆盖索引的情况 : 解决办法 :
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析
文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...
- mysql覆盖索引详解
覆盖索引的定义: 如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’.即只需扫描索引而无须回表. 只扫描索引而无需回表的优点: 1.索引条目通常远小于数据行大小,只需要读取索引, ...
随机推荐
- 《Vue2 框架入门第一课:基础概念与环境搭建》
前端宇宙的新钥匙 --Vue2 在前端开发的广袤宇宙中,Vue2 框架宛如一把闪耀的钥匙,为开发者们开启了一扇通往高效.灵活构建用户界面的大门.随着互联网技术的飞速发展,前端开发的复杂性与日俱增,对开 ...
- 发那科机器人R2000iC控制柜常见故障类型
发那科机器人维修R2000iC控制柜常见故障类型 电源故障: 发那科机器人R2000iC控制柜不能正常供电,可能是由于电源线路损坏.保险丝烧断.电源模块故障或电压不稳定等原因造成. 通信故障: 控制柜 ...
- 二叉树层次遍历下到上,左到右python
# 利用队列进行层次遍历就行class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None ...
- PERT 图表教程
(翻译自: PERT Chart Tutorial) PERT 图表 是(程序评估和审查技术)的首字母缩写.PERT 图是一种项目管理工具,用于在项目中安排.组织和协调任务.它基本上是一种分析完成给定 ...
- Docker - 在docker中部署Nginx
1.docker search 查找ngix 2.docker pull下载镜像 3.查看镜像列表 4.docker run启动容器 5.测试nginx容器是否启动成功 1.docker search ...
- Processing 使用pixels[]像素数组绘制矩形rect和圆形ellipse
余温 两次绘制了棋盘格,有了一些经验了,顺着学习态势,我们再接再厉,挖一些技巧.这一次要使用pixels[]数组绘制矩形rect和圆形ellipse,也就是代替rect()和ellipse()两个函数 ...
- 大数据之路Week10_day04 (Hbase的二级索引,二级索引的本质就是建立各列值与行键之间的映射关系)
二级索引的本质就是建立各列值与行键之间的映射关系 HBASE是在hadoop之上构建非关系型,面向列存储的开源分布式结构化数据存储系统. Hbase的局限性: HBase本身只提供基于行键和全表扫描的 ...
- Java、Python等接入方式对接股票数据源API接口
为了创建一个Python项目来对接StockTV的API接口,我们可以使用requests库来发送HTTP请求,并使用websocket-client库来处理WebSocket连接.以下是一个简单的P ...
- minecraft mods descrip
1. [Advanced Finders]矿物探测器 mod 显示玩家周围附近矿石的方向(指针显示水平面上可到达的矿石) 探测地下深部矿脉(箭头显示最近矿脉的方向(上/下)) 发现大型矿床时发出信号( ...
- 配置tmux默认shell使用fish
设置tmux创建新窗口的时候的默认的shell类型 编写~/.tmux.conf文件 set-option -g default-shell /usr/bin/fish # 或者你想要的任何其他 sh ...