索引基础篇
前言
- 通过本篇博客的学习,我希望大家可以了解到 “索引” 是为了提高数据的查询效率。
索引的介绍
- 索引是为了提高查询数据效率的数据结构
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
索引的作用
如下图所示:学生表 student
执行一条sql语句(查询名为郑家谋 的出生年月日)
select birthday from student where stuName='郑家谋';在不使用索引的情况下,我们要进行全文检索。
数据是一条条查找, 和目标条件比对,直到找到为止,这样的效率无疑是比较慢的。
也是因为如此,后面推出了索引。
那么索引是怎么样的呢?
在这里我先提一下:索引是一个B+tree 类型的数据结构
在这里,暂时把B+tree看作一个平衡二叉树。我们知道 平衡二叉树的特点
- 左子结点小于根节点,根节点小于右子结点
- 左右高度相差最大相差一
在我们查询数据时,我们拿目标数据,首先比较根结点存储的数据,如果比它大,就舍弃左子结点,和右子结点比较;如果比它小,和左子节点比较。以此类推,每次都舍弃一部分,这样查询效率就高了。
但实际上B+tree 数据结构 是在平衡二叉树的基础上,不仅保留了平衡二叉树的优点,同时也弥补了平衡二叉树的缺点。这个具体在下一篇博客讲B+tree的结构时,详细叙述。
索引的特点
| 优势 | 劣势 |
|---|---|
| 提高数据检索的效率,降低数据库的IO成本 | 索引列也是要占用空间的 |
| 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。 | 索引大大提高了查询效率,同时却也降低更新表的速度, 如对表进行INSERT、UPDATE、DELETE时,效率降低。 |
现在我们对索引的优势/劣势,详细的分析
优势
提高数据检索的效率,降低数据库的IO成本
理解
我们可以把我们使用的数据库图形化界面工具如datagrip 等 ,看作客户端。我们执行的每一条SQL语句,都可以看作向数据库服务器,发送请求。服务器使用IO流读取数据,如果不使用索引,就需要去读全部的内容。这样会消耗大量的IO资源。称为全表扫描(全文检索);如果使用索引,就只需要读取目标数据。降低了数据从磁盘(硬盘)读取到内存,这样读取的数据量减少
疑问:在数据库查询数据,数据是从 磁盘读取到内存(最先查到结果)存储数据的不是在硬盘上吗,不应该从硬盘上读取吗
如果大家有像我一样的疑惑,以下是我 查到资料后的理解
1 硬盘和磁盘的关系
- 磁盘包括硬盘也是可以存储数据的。在非技术上,磁盘和硬盘可以统一理解,都把它看成硬盘。在数据库中也是如此。
2 数据库查询数据的过程:
- 当数据库接收到一个查询请求时,它会首先检查所需的数据是否已经在内存(缓存)中。如果数据已经在内存中,数据库可以直接从内存中读取数据,这通常比从硬盘读取要快得多。
- 如果数据不在内存中,数据库需要从硬盘上读取数据。这个过程称为“页缺失”(page miss),数据库会从硬盘上读取数据页到内存中,然后从内存中提供给处理器。
通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗
理解
索引通常是有序的,这意味着数据已经被排序。如果查询请求需要返回排序后的结果,数据库可以直接利用索引的有序性来快速返回排序后的数据,而不需要额外的CPU资源来对数据进行排序。
劣势
索引列也是要占用空间的
理解
索引是一个数据结构,因此在硬盘中存储的不仅有数据库数据,还有索引数据。加大硬盘存储空间的占有
索引大大提高了查询效率,同时却也降低更新表的速度, 如对表进行INSERT、UPDATE、DELETE时,效率降低。
理解
虽然索引可以加快查询速度,但它们也会减慢数据的插入、更新和删除操作的速度。
原因如下
我认为索引本质上是为了查询表数据服务的,为了提高查询效率。因此当数据发生变化时(如插入、更新或删除),数据库系统不仅需要更新表中的数据,还需要更新所有相关的索引以保持数据的一致性。这个过程需要额外的时间和资源,尤其是在有大量索引或大量数据变动的情况下。
总的来说,索引是提高数据库查询效率的重要工具,但它们也带来了额外的存储和维护成本。在设计数据库时,需要根据具体的应用场景和需求来权衡是否使用索引以及该如何设计索引。
本篇博客,简单的介绍了索引,下一篇博客,详细将索引的结构
相关文章:
索引基础篇
前言 通过本篇博客的学习,我希望大家可以了解到 “索引” 是为了提高数据的查询效率。 索引的介绍 索引是为了提高查询数据效率的数据结构 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着…...
多进程与多线程分不清?
多进程对应的是fork函数,而多线程对应的是thread函数。 fork 与 thread 的区别: fork开辟新进程,使用了新的资源空间,父子进程对变量的修改互不影响。由于每个进程都是独立的个体,进程间无法直接进行通信。 thread开辟…...
【零基础学习CAPL】——XML工程创建与使用详解
🙋♂️【零基础学习CAPL】系列💁♂️点击跳转 ——————————————————————————————————–—— 从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者,时光不负有心人。 文章目录 1.概述2.XML和CAPL/.NET之间的区别…...
市场营销应该怎么学?
别一听市场营销就觉得是那些大公司玩的高深莫测的游戏,其实它就在你我身边,无处不在,影响着咱们生活的方方面面。 记得去年双十一,你是不是被各种优惠券、预售、秒杀整得头晕眼花,最后还是忍不住剁了手? …...
作为一个前端开发者 以什么步骤学习后端技术
作为一个前端开发者,学习后端技术可以按照以下步骤进行: 明确学习目标 确定方向:明确自己想学习的后端技术栈(如Node.js、Python、Java等)。 设定目标:短期目标(如完成一个简单的后端项目&…...
大数据新视界 -- 大数据大厂之经典案例解析:广告公司 Impala 优化的成功之道(下)(10/30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
yolov8涨点系列之Concat模块改进
文章目录 Concat模块修改步骤(1) BiFPN_Concat3模块编辑(2)在__init_.pyconv.py中声明(3)在task.py中声明yolov8引入BiFPN_Concat3模块yolov8.yamlyolov8.yaml引入C2f_up模块 在YOLOv8中, concat模块主要用于将多个特征图连接在一起。其具体…...
JavaAPI(1)
Java的API(1) 一、Math的API 是一个帮助我们进行数学计算的工具类私有化构造方法,所有的方法都是静态的(可以直接通过类名.调用) 平方根:Math.sqrt()立方根:Math.cbrt() 示例: p…...
【大模型】通过Crew AI 公司的崛起之路学习 AI Agents 的用法
AI 技术的迅猛发展正以前所未有的速度重塑商业格局,而 AI Agents,作为新一代的智能自动化工具,正逐步成为创新型公司的核心力量。在本文中,我们将探讨如何利用 AI Agents 构建一家 AI 驱动的公司,并详细了解 Crew AI 创…...
Python接口自动化测试实战
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 接口自动化测试是指通过编写程序来模拟用户的行为,对接口进行自动化测试。Python是一种流行的编程语言,它在接口自动化测试中得到了广泛…...
前端Web用户 token 持久化
用户 token 持久化 业务背景:Token的有效期会持续一段时间,在这段时间内没有必要重复请求token,但是pinia本身是基于内存的管理方式,刷新浏览器Token会丢失,为了避免丢失需要配置持久化进行缓存 基础思路:…...
【测试工具篇一】全网最强保姆级教程抓包工具Fiddler(2)
本文接上篇Fiddler介绍,开始讲fiddler如何使用之前,给大家讲讲http以及web方面的小知识,方便大家后面更好得理解fiddler使用。 目录 一、软件体系结构---B/S与C/S架构 B/S架构 C/S架构 二、HTTP基础知识 什么是http请求和响应? http协…...
ONLYOFFICE 文档8.2更新评测:PDF 协作编辑、性能优化及更多新功能体验
文章目录 🍀引言🍀ONLYOFFICE 产品简介🍀功能与特点🍀体验与测评ONLYOFFICE 8.2🍀邀请用户使用🍀 ONLYOFFICE 项目介绍🍀总结 🍀引言 在日常办公软件的选择中,WPS 和微软…...
【WebRTC】视频采集模块中各个类的简单分析
目录 1.视频采集模块中的类1.1 视频采集基础模块(VideoCaptureModule)1.2 视频采集工厂类(VideoCaptureFactory)1.3 设备信息的实现(DeviceInfoImpl)1.4 视频采集的实现(VideoCaptureImpl&#…...
【大模型系列】Grounded-VideoLLM(2024.10)
Paper:https://arxiv.org/pdf/2410.03290Github:https://github.com/WHB139426/Grounded-Video-LLMHuggingface:https://huggingface.co/WHB139426/Grounded-Video-LLMAuthor:Haibo Wang et al. 加州大学,复旦 动机&a…...
EV录屏好用吗?盘点2024年10款专业好用的录屏软件。
EV录屏的方式有很多种,它设置了很多模式,并且录制高清,可以免费使用。但是现在很多的录屏工具都有着与这个软件相似的功能,在这里我可以给大家列举一些。 1、福昕电脑录屏 这个软件为用户提供了多种录制模式,让视频录…...
Pandas | 理性判断数据是否存在缺失值的一种方法
理性判断 一般思路进一步思考df[B].explode() 一般思路 tcc.info()上述信息info显示没有缺失值 但是真实的情况还是要根据业务实际分析tcc.isnull().sum() # 和tcc.info()作用和tcc.info() 其实是一样的 进一步思考 在此过程中,我们需要检验是否存在采用别的值来表…...
ENSP (虚拟路由冗余协议)VRRP配置
VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种用于提高网络可用性和可靠性的协议。它通过在多个路由器之间共享一个虚拟IP地址,确保即使一台路由器发生故障,网络依然能够正常运行,防止…...
move_base
move_base 官方介绍:http://wiki.ros.org/move_base 如果在仿真环境下, sensor source、odometry source 和 sensor transforms 都已提供好,我们只需要完成以下部分: 一、编写导航程序 ①创建 ROS 工作空间 和 pkg 包 mkdir -p …...
Android Intent 跳转常见系统设置
常量值描述android.settings.DATA_ROAMING_SETTINGS显示 2G/3G 选择的设置android.settings.SETTINGS显示系统设置android.settings.WIFI_SETTINGS显示设置以允许配置 Wi-Fiandroid.intent.action.POWER_USAGE_SUMMARY显示电池 … 更多GO 官网...
SMUDebugTool:16核心独立调节与实时硬件监控的锐龙平台性能优化工具
SMUDebugTool:16核心独立调节与实时硬件监控的锐龙平台性能优化工具 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...
5个高效实用的英雄联盟工具集使用指南
5个高效实用的英雄联盟工具集使用指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是一款基于LCU API开发的开源…...
LaTeX排版踩坑记:用了soul包高亮,为什么一加\cite就报错?
LaTeX排版进阶:soul包高亮冲突的底层原理与系统化解决方案 当你正在用LaTeX优雅地排版论文,突然在引用文献时遭遇神秘的报错——这种体验就像穿着正装踩到香蕉皮。soul包作为文本装饰的瑞士军刀,其高亮和删除线功能深受喜爱,但一旦…...
AudioSeal效果展示:实测音频隐形水印,听不出区别但能精准检测
AudioSeal效果展示:实测音频隐形水印,听不出区别但能精准检测 1. 音频水印技术概述 1.1 什么是音频隐形水印 音频隐形水印是一种将数字标识信息嵌入到音频信号中的技术,这些信息对人类听觉系统几乎不可感知,但可以通过专用算法…...
PasteMD真实案例分享:从零散笔记到结构化学习计划的全过程
PasteMD真实案例分享:从零散笔记到结构化学习计划的全过程 1. 引言:当杂乱笔记遇上智能格式化 你是否经历过这样的困境?电脑桌面上散落着十几个临时创建的记事本文件,手机备忘录里堆满了未经整理的零散想法,会议录音…...
Python多线程性能翻倍实录(GIL禁用+细粒度原子操作配置全指南)
第一章:Python无锁GIL环境下的并发模型概览Python 的全局解释器锁(GIL)长期被视为多线程 CPU 密集型任务的瓶颈。然而,随着 CPython 3.13 的正式引入“实验性无锁 GIL”(--without-pymalloc 配合 --with-gildisabled 构…...
CentOS7快速部署Golang 1.22.2开发环境全攻略
1. 为什么选择CentOS7部署Golang 1.22.2 最近在帮团队搭建新的开发环境时,我发现很多同事还在用老旧的Golang版本。作为目前最稳定的Linux发行版之一,CentOS7依然是企业级开发环境的首选。而Golang 1.22.2作为2024年发布的最新稳定版,带来了不…...
all-MiniLM-L6-v2开发者案例:集成至LangChain实现动态RAG检索链路
all-MiniLM-L6-v2开发者案例:集成至LangChain实现动态RAG检索链路 在构建智能问答或文档分析系统时,一个核心挑战是如何从海量文本中快速、准确地找到最相关的信息。传统的基于关键词的搜索,往往因为无法理解语义而“答非所问”。今天&#…...
算法 POJ1029
一.题目大意假币描述“金条”银行从可靠来源收到的信息,在他们最后一组的 N 枚硬币中,恰好有一枚硬币是假的,并且重量与其他硬币不同(而所有其他硬币的重量都相同)。经济危机之后,他们只有一个简…...
技术突破:抖音下载工具的全流程实战指南
技术突破:抖音下载工具的全流程实战指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容爆炸的时代,高效获取和管理短视频资源已成为创作者、研究者和普通用户的核心需求。…...
