MySQL数据库复习——索引

news2024/11/24 4:43:05

目录

一、什么是索引?索引的作用

二、索引的简单使用

三、索引背后的数据结构

1、B 树

2、B + 树


一、什么是索引?索引的作用

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

官方的概念往往难以理解,简单来说索引就像我们书本的目录,能够加快我们查询速度。

在加快我们查询速度的同时,索引同时也要消耗存储空间(就好比目录也要费纸一样~)

索引的使用场景?

  • 数据量较大,且经常对这些列进行条件查询
  • 该数据库表的插入操作,及对这些列的修改操作频率较低。

满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率

反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

二、索引的简单使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。

  • 查看索引
show index from 表名;
  • 创建索引 (对于非主键,非唯一约束,非外键的字段可以创建普通索引)
create index 索引名 on 表名(字段名);
  • 删除索引
drop index 索引名 on 表名;

三、索引背后的数据结构

首先我们可以思考一下为什么索引背后的数据结构是 B+ 树而不是顺序表、链表、哈希表、二叉搜索树等数据结构?

  • 顺序表和链表

顺序表和链表查找的时间复杂度都是O(N)的,这里我想消除一个误区就是好多人认为顺序表的查找是O(1)的,但其实按下标获取元素并不叫”查找“,查找是指按值找到对应的元素,因此显然这两种数据结构的复杂度都是线性的,不符合我们的预期。

  • 哈希表

提到哈希表我们不得不说它是一个非常伟大的数据结构,因为它查找的时间复杂度是O(1)的,但我们依旧不能选择它,因为哈希表是根据哈希映射构建的,简单来说哈希表是没有顺序的,因此我们无法处理 >  || == || < 的情况,试想,如果我们查找无法使用 比较 ,那无疑是致命的

  • 二叉搜索树

二叉搜索树无疑是一个很适合作为索引的数据结构,在建树完美的情况下它的时间复杂度是O(N),并且适合范围查找,我们只需要找到两个端点中序遍历即可,但它美中不足的就是每个结点只有两个分叉,在数据量非常恐怖的时候树的高度仍然很高

1、B 树

ps:图片来源:wwzzzzzzzzzz博主

相信很多同学发现了,在确定区间时,B 树仍然需要经过多次比较,那么相比之前我们提到过的二叉搜索树,B 树的优点是什么? 

 B - Tree 的优点:

  • N 叉树的树高非常低,查询很快
  • 叶子结点和非叶子结点都可以存储数据,并且都可以存多个数据
  • 一个结点多次比较,虽然比较次数更多,但硬盘IO次数降低
  • 硬盘的访问速度是很慢的,因此减少硬盘IO次数,远比减少比较次数要更划得来

2、B + 树

B + 树是在 B 树的基础上改进而来,可以这么说:B + 树就是一种为索引而生的数据结构!

什么是 B + 树

【B+ 树 是 数据库中最常见的数据结构】
注意!数据库有很多种,每个数据库底层又支持多种存储引擎
这些存储引擎实现了数据库具体按照什么结构来存储的程序。
那么就意味着 每个存储引擎 存储数据的结构 可能都不一样,背后的索引数据结构可能也不同。
所以,这里面可能会有很多种多叉树来去表示这里的数据结构。
只是 B+ 树 是 最常用的一种数据结构。
那么,B+ 树 又是什么样子的?

 

 B+ Tree 的优点:

  • 一个结点可以存很多值,在进行查找的时候整体IO次数较少,速度快
  • 所有的查询都会落到叶子结点上,每次查询的IO次数都差不多,查询速度稳定
  • 叶子结点最终是一个链表,非常适合范围查找
  • 非叶子结点只存储key,相同内存下B+树可以存储更多索引

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nacos 配置中心

1. 什么是配置中心 1.1 什么是配置 应用程序在启动和运行的时候往往需要读取一些配置信息&#xff0c;配置基本上伴随着应用程序的整个生命周期&#xff0c;比如&#xff1a;数据库连接参数、启动参数等。 配置主要有以下几个特点&#xff1a; 配置是独立于程序的只读变…

java基础讲义03

java基础讲义一 流程控制1.1流程控制语句介绍1.2顺序结构二 选择控制2.1 选择结构介绍2.2 选择语句if2.2.1 格式12.2.2 if格式22.2.3 if格式32.3 选择语句switch2.3.1 switch语句介绍2.3.2 switch注意事项2.3.3 switch面试题2.3.4 if语句与switch语句区别三 循环语句3.1 循环语…

Yolov5 计算访存量MAC与计算量FLOPS

说明&#xff1a;因为yolov5函数中已经计算了 FLOPS&#xff0c;因此如果想要计算访存量那么只需按照flops的位置,添加访存量的计算即可 一、先记住计算量和访存量的公式&#xff1a; 二、找到计算FLOPS的位置&#xff0c;并添加访存量 yolov5中计算flops的位置在torch_utile…

微服务外交官-Feign

引言 书接上篇 负载均衡组件Ribbon核心-LoadBalanced-下 我们讲完了Ribbon负载均衡原理之后&#xff0c;接下讲一个SpringCloud Alibaba新的组件&#xff1a;Fegin 前面章节我们使用Ribbon方式实现负载均衡版的远程调用&#xff0c; //方案4&#xff1a;使用Ribbon方式--带负…

不知道10年老电脑如何重装系统?其实很简单

肯定很多朋友家里都有一两台吃灰的10年老电脑了&#xff0c;当我们有空可以把它拿出来耍耍的时候&#xff0c;却发现电脑无法开机了&#xff0c;想拿去修又觉得不太值得。其实我们可以先试着给电脑重装系统&#xff0c;这样也能先排查系统是否有问题。如果你不知道这台10年老电…

【Linux】Linux编译器-gcc/g++使用

大家好我是沐曦希&#x1f495; 文章目录1.背景知识1.1 预处理1.2 编译&#xff08;生成汇编&#xff09;1.3 汇编&#xff08;生成机器可识别代码&#xff09;1.4 链接接(生成可执行文件或库文件&#xff09;1.5 习题习题一习题二2.函数库2.1 动态库2.2 静态库3.g的基本使用4.…

数据结构之二叉树

数据结构之二叉树什么是二叉树二叉树的特殊类型二叉树的遍历方式二叉树的叶子结点求法二叉树的高度求法什么是二叉树 二叉树&#xff08;Binary tree&#xff09;是树形结构的一个重要数据类型&#xff0c;想要成为二叉树必须满足两个条件。1、本身是有序树。2、树中包含的各个…

【小程序】导航栏和内容页面联动效果实现

&#x1f4ad;&#x1f4ad; ✨&#xff1a; 微信小程序导航栏和页面联动   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 因为很多东西来不及去做去看可是时间很快总是赶不上&#xff0c;所以要去成长呀&#x1f49c;&#x1f49c;   &#x1f338;: 如有错…

React—— HelloWorld

React 学习笔记Hello WorldJSX (JavaScript XML) 语法规则JavaScript 语法函数组件、类组件 & 属性 props组合组件生命周期函数 & 状态 state事件处理refs受控组件、非受控组件 & 高阶函数、函数的柯里化npm参考Hello World <!DOCTYPE html> <html lang&…

Request请求转发与Respones请求重定向有什么区别?

目录&#xff1a; 1.Request请求转发 2.Respones请求重定向 3.关于转发和重定向的路径问题 1.Request请求转发 请求转发(forward)是一种在服务器内部的资源跳转方式。 (1)浏览器发送请求给服务器&#xff0c;服务器中对应的资源A接收到请求 (2)资源A处理完请求后将请求发…

在html中使用js实现图片的无缝滚动(四种状态)

文章目录js原理实施任务1.从左往右无缝滚动代码示例运行效果2.从右往左无缝滚动代码示例运行效果3.从上往下无缝滚动代码示例运行效果4.从下往上无缝滚动代码示例运行效果js原理 获取整个ul和ul下面的所有li&#xff0c; 把ul里面的li内容添加一份&#xff0c;因为需要完成图片…

【加油站会员管理小程序】01需求分析

随着这两年微搭产品的迭代,目前组件基本够用,像常用的支付这种功能也是有的,因此我们就可以结合现有功能来完成一个实际使用的小程序的开发。 我们本次的实战课,是以加油站的业务场景为出发点,涵盖会员的开通、充值、消费、积分兑换等常用场景。结合实战案例,我们完整的…

12月2日:thinkphp中的链式操作

补充内容&#xff1a; 今天我们就来聊聊limit和page的区别以及group by需要注意的点&#xff0c;where和having的区别 limit和page 区别 Limit 限制查询数量&#xff0c;在进行分页查询的时候用的最多&#xff0c;但是limit在查询限制中的索引值是从0开始的&#xff0c;lim…

基于Java+Springboot+Vue+elememt疫情返乡人员管控系统设计实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取联系&#x1f345;精彩专栏推荐订阅收藏&#x1f447;&…

一文搞懂如何学习Android内部命令行工具集合

目录 1.安卓命令工具集 2.命令如何使用&#xff08;举例&#xff09; 2.1 am命令使用 2.2 dumpsys 命令使用 2.3 wm命令用法 2.4 rm命令的用法 2.5 logcat 命令的用法 2.6 cat 命令的用法 3.个人如何学习 3.1 推荐学习方法一 3.2 方法二 1.安卓命令工具集 安卓支持…

JMeter入门教程(7) --思考时间

1.人物背景 在JMeter脚本中&#xff0c;思考时间使用定时器模拟实现的 2.任务目标 掌握基于JMeter性能测试脚本开发——思考时间 3.任务实操 3.1 固定定时器 右击取样器&#xff0c;选择“添加 > 定时器 > 固定定时器&#xff0c;如图示&#xff1a; 2.固定定时器页…

手机无线耳机什么牌子的好用?2022好用的无线蓝牙耳机排行榜

现如今的蓝牙耳机市场中有着多种机型&#xff0c;不同功能&#xff0c;不同价格的蓝牙耳机数不胜数&#xff0c;一部手机、一副耳机似乎已经成为了人们外出的搭配。那么手机无线耳机什么牌子的好用呢&#xff1f;下面我来给大家推荐几款好用的无线蓝牙耳机&#xff0c;大家可以…

团队协作利器----API接口Eolink

本文目录&#xff1a;一、初识Eolink1.什么是Eolink2.我与Eolink的故事二、Eolink突出特点----团队协作协同工作分享协作支持所有类型API文档、测试方便导出接口文档方便查看历史记录三、Eolink优势总结前言&#xff1a; hello大家好&#xff0c;我是Dream&#xff0c;在我们的…

安卓中adb命令工作的底层原理及使用举例

目录 1. adb安卓调试桥 2.adb的组成 3.adb命令的使用举例: 3.1什么是应用包?什么是应用界面? 3.2 adb 命令如何获取应用应用包名和应用界面名? 1. adb安卓调试桥 adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb我们可以在Eclipse中方便通过…

c程序从编译开始到运行结束的过程

重温c语言 我们在linux平台下建立一个a.c文件,程序很简单&#xff0c;显示输出Please input your name:&#xff0c;然后让我们输入名字&#xff0c;最后调用了一个子函数输出hello,我们的名字 #include<stdio.h>void hello(char * name);int main(){char name[16]{0};p…