MySQL 覆盖索引

目录

一、什么是索引

二、索引的有哪些种类?

 三、InnoDB的不同的索引组织结构是怎样的呢?

四、什么是覆盖索引 

五、如何使用是覆盖索引?

六、如何确定数据库成功使用了覆盖索引呢

总结:


一、什么是索引

        索引(在 MySQL 中也叫“键key”)是存储引擎快速找到记录的一种数据结构,通俗来说类似书本的目录,这个比方虽然被用的最多但是也是最恰如其当的,在查询书本中的某个知识点不借助目录的情况下,往往都找的够呛,那么索引相较于数据库的重要性也可见一斑。

二、索引的有哪些种类?

        索引的种类这里只罗列出InnoDB支持的索引:主键索引(PRIMARY),普通索引(INDEX),唯一索引(UNIQUE),组合索引,总体划分为两类,主键索引也被称为聚簇索引(clustered index),其余都称呼为非主键索引也被称为二级索引(secondary index)。

 三、InnoDB的不同的索引组织结构是怎样的呢?

        众所周知在InnoDB引用的是B+树索引模型,这里对B+树结构暂时不做过多阐述,很多文章都有描述,在第二问中我们对索引的种类划分为两大类主键索引和非主键索引,那么问题就在于比较两种索引的区别了,我们这里建立一张学生表,其中包含字段id设置主键索引、name设置普通索引、age(无处理),并向数据库中插入4条数据:("小赵", 10)("小王", 11)("小李", 12)("小陈", 13)

CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',`name` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '名称',`age` int(3) unsigned NOT NULL DEFAULT '1' COMMENT '年龄',PRIMARY KEY (`id`),KEY `I_name` (`name`)
) ENGINE=InnoDB;INSERT INTO student (name, age) VALUES("小赵", 10),("小王", 11),("小李", 12),("小陈", 13);

这里我们设置了主键为自增,那么此时数据库里数据为

每一个索引在 InnoDB 里面对应一棵B+树,那么此时就存着两棵B+树。

可以发现区别在与叶子节点中,主键索引存储了整行数据,而非主键索引中存储的值为主键id, 在我们执行如下sql后

SELECT age FROM student WHERE name = '小李';

流程为:

  1. 在name索引树上找到名称为小李的节点 id为03
  2. 从id索引树上找到id为03的节点 获取所有数据
  3. 从数据中获取字段命为age的值返回 12 在流程中从非主键索引树搜索回到主键索引树搜索的过程称为:回表,在本次查询中因为查询结果只存在主键索引树中,我们必须回表才能查询到结果,那么如何优化这个过程呢?引入正文覆盖索引

四、什么是覆盖索引 

        覆盖索引(covering index ,或称为索引覆盖)即从非主键索引中就能查到的记录,而不需要查询主键索引中的记录,避免了回表的产生减少了树的搜索次数,显著提升性能。 

五、如何使用是覆盖索引?

        之前我们已经建立了表student,那么现在出现的业务需求中要求根据名称获取学生的年龄,并且该搜索场景非常频繁,那么先在我们删除掉之前以字段name建立的普通索引,以name和age两个字段建立联合索引,sql命令与建立后的索引树结构如下

ALTER TABLE student DROP INDEX I_name;
ALTER TABLE student ADD INDEX I_name_age(name, age);

 

那在我们再次执行如下sql后 

SELECT age FROM student WHERE name = '小李';

流程为:

  1. 在name,age联合索引树上找到名称为小李的节点
  2. 此时节点索引里包含信息age 直接返回 12

六、如何确定数据库成功使用了覆盖索引呢

        当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息 

        这里我们很清楚的看到Extra中Using index表明我们成功使用了覆盖索引 

总结:

        覆盖索引避免了回表现象的产生,从而减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是性能优化的一种手段,文章有不当之处,欢迎指正~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/438900.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ Qt开发:运用QJSON模块解析数据

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QJson组件的实现对JSON文本的灵活解析…

Vulnhub靶机:Pwn the Tron

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:Pwn the Tron(10.0.2.40) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entry/…

【如何轻松拿捏LIO-SAM?】今天终于来啦!!

中科院保研硕士教你如何轻松拿捏LIO-SAM,不仅会对LIO-SAM的论文原理和代码进行详细讲解,也会对SLAM中的数学知识、LOAM、LeGO-LOAM的论文原理及代码进行详细讲解,2024年1月28日开始更新啦!之后每周日晚20:00更新一章,欢…

Windows Server 2003 Web服务器搭建

系列文章目录 目录 系列文章目录 前言 一、Web服务器是什么? 二、配置服务器 1.实验环境搭建 2.服务器搭建 1)控制面板中找到增加或删除程序打开 2)点击增加程序 3)安装Web服务器 4)查看安装是否成功 5)打开Internet信息服务(IIS)管理器,进行配置 6)找…

Codeforces Round 785 C. Palindrome Basis

C. Palindrome Basis 题意 定义一个正整数 a a a 是回文的(没有前导 0 0 0)当且仅当: a a a 的十进制表示形式回文 给定一个正整数 n n n ,求出将 n n n 拆分成若干个回文数之和的方案数 思路 这是一个经典模型&#xff0…

简单、在线、实时的多目标跟踪实现(C++)

文章目录 依赖建立镜像运行demo下载数据创建简单的数据链接在镜像中编译和运行代码代码依赖 Ubuntu 16.04Docker 18.09.4OpenCV 3.4.2Boost 1.58.0建立镜像 cd /path/to/sort-cpp docker build -t sort . ./docker_run.sh运行demo

路由进阶

文章目录 1.路由的封装抽离2.声明式导航 - 导航链接3.声明式导航-两个类名自定义匹配的类名 4.声明式导航 - 跳转传参查询参数传参动态路传参两种传参方式的区别动态路由参数可选符 5.Vue路由 - 重定向6.Vue路由 - 4047.Vue路由 - 模式设置8.编程式导航 - 两种路由跳转9.编程式…

Node.js-express

1.了解Ajax 1.1 什么是ajax Ajax的全称是Asynchronous Javascript And XML(异步Js和XML). 通俗的理解:在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式,就是Ajax 1.2 为什么要学习Ajax 之前所学的技术&#xff0c…

Go语言基础之单元测试

1.go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go …

Linux部署幻兽帕鲁服务器,PalWorld开服联机教程,保姆级教程

Linux系统搭建幻兽帕鲁服务器,PalWorld开服联机教程,保姆级教程 最近这游戏挺火,很多人想跟朋友联机,如果有专用服务器,就不需要房主一直开着电脑,稳定性也好得多。 幻兽帕鲁简介 《幻兽帕鲁》是一款游戏…

快速上手Git

目录 一、Git概述 二、Git的常用命令 Git全局配置 获取Git仓库 基本概念 本地仓库操作 远程仓库操作 分支操作 标签操作 三、在IDEA中使用Git 在IDEA中配置Git 本地仓库操作 远程仓库操作 分支操作 冲突解决 一、Git概述 Git是一个分布式版本控制工具&…

Python算法题集_和为K的子数组

本文为Python算法题集之一的代码示例 题目560:和为K的子数组 说明:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nu…