MySQL数据库的索引

article/2025/11/3 19:05:55

在这里插入图片描述

文章目录

  • 一、索引是什么?
    • 索引的作用
  • 二、索引的使用
    • 查看索引
    • 创建索引
    • 删除索引
  • 三、索引的底层

一、索引是什么?

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。

索引的作用

1.数据库中的表,数据,索引之间的关系,类似于书架上的图书,图书内容,图书目录的关系。
2.顾名思义,索引类似于图书目录,可以快速的定位我们想要看的位置。
3.索引可以大大提高数据库的性能。

索引我们可以例比着书的目录去理解,当我们有了目录的时候,我们就可以很快的找到对应内容的位置。
索引的效果:
加快了查找的速度,进行数据库操作时,常用的操作是增删查改,但是查询是日常业务中最最频繁的操作

同时,索引提高查询速度的同时,也增加了增删改的开销,因为当我们修改操作时,索引也会跟着改变。空间的开销也会增大,需要额外的空间来保存索引。

二、索引的使用

查看索引

show index from 表名;
-- 创建一个学生表
create table student(id int primary key,name varchar(50));

在这里插入图片描述
我们可以发现在学生表中,我们未手动添加索引,但是它会自带一个索引。
创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。其实也很好理解,上面这几种情况,在进行相关操作时,都会先对表中相应的列去查询,如果不去添加索引,就会去一条一条去遍历表中的数据,那么效率将大大的低下.

创建索引

create index 索引名 on 表名(字段名);
-- 给学生表名字创建一个索引create index idx_stu_name on student(name);

在这里插入图片描述
我们可以发现成功给name加入了一个索引。
注意事项;
索引虽然是一个很便捷的东西,但是我们使用它的时候一定得小心,我们如果需要加索引的话尽量在创表的时候就搞好,否则将是一个十分危险的操作,如果我们这个时候去创建一个索引的话,就会占据大量的资源(磁盘IO等),就跟我们在写一本书,在写好书之后再去编写目录,索引是同理,是一件很麻烦的事情,会花费大量时间,时间取决于数据量的大小

加上索引后查询一定快吗?
不一定,当数据量特别少,一行行查询可能会更快。
如果你是给大量重复的数据加索引(如性别),也是无法提高查询速度的。

删除索引

drop index 索引名 on 表名;
-- 删除学生表name索引
drop index idx_stu_name on student;

在这里插入图片描述
同样的删除索引也是会耗费大量的资源,是一项危险的操作

三、索引的底层

那么索引在MySQL中的数据结构是什么呢?
1.哈希表
在这里插入图片描述
哈希表是一项查询为常数项的数据结构,但是哈希表不适合去当做数据库的索引。因为哈希表虽然查找速度很快,但无法进行between and这样的范围查询。
2.二叉搜索树
在这里插入图片描述
这里我们在查询元素的时候,时间复杂度是多少?
long(N),当这个二叉搜索树是单分支最差情况下,二叉树因为前序遍历是有序的,因次可以满足between and 的范围查询,但是当元素个数增多时,树的高度高时,元素的比较的次数也会增多,硬盘的操作也会增多,因此也不太适合。
3.N叉搜索树
在这里插入图片描述
我们可以发现N叉搜索树(B树),在二叉搜索树的基础上,每个节点有多个值,同时有多个分叉,树的高度降低了,比较次数虽然没有减少,但是在硬盘上读的次数减少了许多(因为每次读的操作都是在硬盘上).我们发现B树已经能够做数据库的索引,但是在实际开发中对性能要求远不止此,B+树就是为了索引量身定做。
4.B+树
在这里插入图片描述
1.B+树是N叉搜索树的一个升级版,每个节点的最后一个值就是局部最大值了。
2.叶子节点会用一个双链表首尾相连,当我们需要进行between and的操作时,只需要root tail 指针指向相应节点,然后遍历即可。
3.父元素会在子节点重复出现,并且是最大值。

B+树的优势:
1.除了叶子节点都是简单的存储了id,最终都会落到叶子结点,所以无论查询那个元素,比较次数大差不差,查询操作不会出现大差异。
2.因为叶子结点存储了所有的key,所以我们只需把真正的数据只存储在叶子结点即可。
3.更适合范围查询,双链表连接。
4.N叉搜索树高度降低了,硬盘上的IO操作大幅度减少。

如果是多索引怎么办?
比如主键索引是id,非主键索引的姓名。
那么姓名索引的B+树的叶子节点存储的都是主键id,找到id后,再去主键索引idB+树去遍历,主键idB+树的叶子节点存储的是完整数据行,此操作成为回表

我们在此处所谈的B+树只是在MySQL的InnDB这个数据库引擎所使用的典型数据结够。不同的数据库有不同的引擎,索引的数据结构也会有所差异。


http://chatgpt.dhexx.cn/article/ntmNG7xW.shtml

相关文章

Mysql数据库索引详解

一、前言 随着我们业务量不断的增大,会发现查询数据库的时间变的越来越长,其实就是数据库到达了性能的瓶颈,这时候需要我们对其进行优化操作,可能我们第一时间就会想到:加索引。没错,这是优化的一个方向&a…

MySQL 数据库--索引(理论详解及实例演示)

文章目录 前言一、索引及分类1.索引的概念2.索引的作用3.索引的副作用4.索引的分类4.1 普通索引4.2 唯一性索引4.3 主键索引4.4 全文索引4.5 组合索引(单列索引与多列索引) 5.创建索引的原则依据 二、创建及查看索引1.准备2.创建索引的方法2.1 创建普通索…

数据库-mysql之索引

目录 1、索引简介 1.1 索引的含义和特点 1.2 索引的分类 1、普通索引 2、唯一性索引 3、全文索引 4、单列索引 5、多列索引 6、空间索引 1.3 索引的设计原则 1.选择唯一性索引 2.为经常需要排序、分组和联合操作的字段建立索引 3&#xff0…

web前端页面开发工具的演进史

小编是一位有着6年前端开发经验的web前端开发工程师&#xff0c;今天小编从个人的视角来聊一聊web前端开发工具的演进史。 小编第一次接触 web前端开发是在2011年&#xff0c;那会还在上高中。当时正是大家都每天忙碌着装扮自己的QQ空间。那时的web前端布局还是以 <table&g…

关于Webpack前端工程化构建,你必须要掌握这些核心知识点

引言 在很久之前&#xff0c;模块化管理还没有出现&#xff0c;如果我们开发一个页面想要引入一些依赖的话&#xff0c;最常见的做法就是将依赖文件引入到.html文件中。比如&#xff0c;我们要使用JS的一些依赖库&#xff0c;就要在.html文件中使用<script>标签引用&…

构建工具 Vite、Webpack、Rollup对比

Webpack介绍 热更新方面&#xff1a;webpack支持HMR&#xff0c;但是webpack需要全部重新编译并更新&#xff0c;效率较低tree-shaking&#xff1a;webpack2开始支持且消除效果不好&#xff0c;但是webpack5有更好的tree-shaking&#xff08;去除未使用代码&#xff09;分包方…

前端三大构建工具 Webpack、Vite、Rollup 优劣势及原理分析

在刚刚结束的 VueConf2021 中&#xff0c;除了 Vue 3.0 以外&#xff0c;另外一个亮点就是下一代构建工具 Vite 了。 在尤雨溪分享的【 Vue 3 生态进展和计划】的演讲中&#xff0c;尤大神还特意提到 Vite 将成为 Vue 的现代标配。甚至最近新推出的 Petite Vue 从开发、编译、发…

从Npm Script到Webpack,6种常见的前端构建工具对比

从Npm Script到Webpack&#xff0c;6种常见的前端构建工具对比 小编说&#xff1a;历史上先后出现了一系列构建工具&#xff0c;它们各有优缺点。由于前端工程师很熟悉JavaScript&#xff0c;Node.js又可以胜任所有构建需求&#xff0c;所以大多数构建工具都是用Node.js开发的。…

前端开发入门:前端构建工具百度FIS

FIS是什么&#xff1f; FIS全称为Front-end Integrated Solution&#xff0c;即前端集成解决方案。前端团队发展大多会经历规范设计、技术选型、系统拆分、性能优化等阶段&#xff0c;其中的技术需求可以总结为前端集成解决方案。FIS是专为解决前端开发中自动化工具、性能优化…

前端工程化——构建工具选型

一、什么是前端工程化 前端工程化是依据业务特点&#xff0c;将前端开发的规范、流程、技术、工具、经验等形成规范并建立成一种标准的体系。 二、为什么要前端工程化 实现前端工程化的目的简单来说就是通过流程规范、自动化工具来提升前端的开发效率、性能、质量、多人协作…

前端构建工具与应用程序测试

1、前端构建工具 什么是前端构建&#xff1f; 什么是构建工具&#xff1f; 自动构建工具 Npm Scripts&#xff08;推荐&#xff09; Npm Scripts&#xff08;NPM脚本&#xff09;是一个任务执行者。NPM是安装Node时附带的一个包管理器&#xff0c;Npm Script 则是 NPM 内置…

前端构建工具gulp的详细介绍以及使用

什么是 gulp为什么要用 gulp如何使用 gulp Installing Gulp Install the gulp commandInstall gulp in your devDependencies Create a gulpfileTest it out gulp API 什么是 gulp gulp 是一个前端构建工具&#xff0c;它能通过自动执行常见任务&#xff0c;比如编译预处理 CS…

去中心化的前端构建工具 — Vite

为什么要使用Vite 在浏览器中提供ES模块之前&#xff0c;开发人员没有以模块化方式编写JavaScript的本机机制。这就是为什么我们都很熟悉“捆绑”的概念:使用工具来抓取、处理和连接源模块到可以在浏览器中运行的文件中。 随着时间的推移&#xff0c;我们看到了webpack、Roll…

vite 前端构建工具

目录 一、vite 简介二、vite 语法纪要三、用 vite 创建项目1、用 vite 创建一个 react 项目2、用 vite 创建一个 vue3 项目 四、vite 和 webpack 的比较 一、vite 简介 Vite 官方中文文档 vite.config 配置文件 Vite 是一个 web 开发构建工具&#xff0c;由于其原生 ES 模块导入…

前端构建工具(理解+使用)

一、构建工具可以做什么&#xff1f; 安装 vs 做事情 1、安装包工具&#xff1a;例如&#xff1a;npm、Bower&#xff0c;Yeoman可以安装几乎所有的东西。 他们可以安装前端框架&#xff0c;比如Angular.js或者React.js。 他们可以为你的开发环境安装服务器。 他们可以安装…

前端构建工具的未来

本文作者系360奇舞团前端开发工程师 本文为翻译 原文标题&#xff1a;The Future Of Frontend Build Tools 原文作者&#xff1a;Alexander Joseph 原文链接&#xff1a;https://www.smashingmagazine.com/2022/06/future-frontend-build-tools/ 前端构建工具对现代前端开发者的…

对前端构建工具的一些理解

前言 最近有幸在前端团队里面做了一次关于 webpack 的技术分享。在分享的准备过程中&#xff0c;为了能让大家更好的理解 webpack&#xff0c;特意对市面上以前和现在流行的构建工具做了一个梳理总结。在整理和分享的过程中&#xff0c;获益匪浅&#xff0c;对前端构建工具有了…

前端构建工具大盘点:gulp、webpack、vite、rollup、esbuild、snowpack、babel、parcel、swc、tsc

文章目录 背景分类转译器打包器 对比gulp VS webpackBundle vs Bundleless&#xff08;代表就是webpack VS vite&#xff09;其他比较 个人理解总结官网 背景 做前端也有好多年了&#xff0c;从最早的 jQuery 时代到现在的三大框架&#xff0c;这过程中用到了很多构建工具&…

前端程序员常用的9大构建工具

构建工具是一个把源代码生成可执行应用程序的过程自动化的程序(例如Android app生成apk)。构建包括编译、连接跟把代码打包成可用的或可执行的形式。 在小型项目中&#xff0c;开发者往往手动调用构建过程&#xff0c;这样在大型的项目中很不实用&#xff0c;在构建过程中难以跟…

Git入门指南二:初次运行Git前的配置

Git入门指南二:初次运行 Git 前的配置 初次运行 Git 前的配置 Git 提供了一个叫做 git config 的工具&#xff0c;专门用来配置或读取相应的工作环境变量&#xff0c;正是由这些环境变量&#xff0c;决定了 Git 在各个环节的具体工作方式和行为。 这些变量可以存放在以下三个…