当前位置: 首页 > news >正文

MySQL索引(Index)

Index

数据库中的索引(Index)是一种数据结构,用于提高数据库查询性能和加速数据检索过程。索引可以看作是数据库表中某个或多个列的数据结构,类似于书中的目录,可以帮助数据库管理系统更快地定位和访问数据。它们是数据库优化的重要工具,特别是在处理大量数据时。

传统的Select搜索策略为:线性搜索,从数据集的开头开始,按顺序逐个比较每个元素,直到找到目标元素或者遍历完整个数据集。
而Index搜索策略为:B-Tree(平衡树)或者B+Tree。

B-Tree(平衡树)索引: B-Tree 是一种常见的索引数据结构,适用于范围查询和等值查询。B-Tree 索引在数据库中广泛使用,它保持树的平衡,使得在平均情况下,每次搜索都能在 O(log n) 时间内找到目标。
B+Tree(平衡加强树)索引: B+Tree 是 B-Tree 的变种,更适合数据库系统,特别是范围查询。B+Tree 的叶子节点形成一个有序链表,可以支持高效的范围查询操作。

执行 CREATE INDEX 语句可以为数据中某个字段构建索引:

 CREATE INDEX index_name ON table_name (column_name);-- 在这里,index_name 是索引的名称(唯一),table_name 是表的名称,column_name 是要创建索引的列名。show index from table_name ; -- 查看索引drop index index_name on table_name;--删除索引

另外需要注意,MySQL为了支持高速搜索,有一些字段或变量默认情况下会自动使用索引。

主键(Primary Key): 在创建表时指定的主键列会自动创建主键索引,确保该列的值唯一且非空。主键索引是一种特殊的唯一性索引,通常用于唯一标识表中的每一行数据。
唯一性约束(Unique Constraint): 在创建表时指定的唯一性约束会自动创建唯一性索引。唯一性索引确保该列的值在表中是唯一的,但允许包含空值。
外键(Foreign Key): 在创建外键时,被引用的列会自动创建索引,以加速连接操作。这个索引通常是 B-Tree 索引。
自动递增列(Auto-Increment Column): 在 MySQL 中,使用自动递增的整数值作为主键,例如 AUTO_INCREMENT 列,会自动创建 B-Tree 索引。

Index的优势与劣势

优势:
提高数据查询效率,降低数据的IO成本。
通过索引对数据进行排序,降低数据排序的成本,降低CPU消耗。

劣势:
索引会占用存储空间。
索引在大大提高查询效率的同时,也降低了insert,update,delete的效率。

B-Tree

B-Tree的结构:
在这里插入图片描述

每个节点可以存储多个Key(有n个key就有n个指针)
所有数据都存储在叶子节点,非叶子节点仅用于索引数据
叶子节点形成一个双向链表,便于数据的排序以及区间范围的查询。

如下是B-Tree查询的伪代码

function search_btree(node, key):// 在当前节点中查找 keyi = 1while i <= node.num_keys and key > node.keys[i]:i = i + 1// 如果 key 等于节点中的某个 key,返回找到的节点if i <= node.num_keys and key == node.keys[i]:return node// 如果是叶子节点,表示 key 不存在if node.is_leaf:return NULL// 否则,继续在相应子节点中查找else:read child_node from disk at node.children[i]return search_btree(child_node, key)

这个伪代码描述了 B-Tree 的查询操作。主要步骤包括:

在当前节点中查找给定的 key,找到一个最小的 i,使得 key 小于等于 node.keys[i]。
如果在当前节点中找到了 key,说明查询成功,返回当前节点。
如果在当前节点中未找到 key,且当前节点是叶子节点,表示 key 不存在,返回 NULL。
如果在当前节点中未找到 key,且当前节点不是叶子节点,进入相应的子节点,继续查找。

重复上述步骤,直到找到 key 或者到达叶子节点。
需要注意的是,B-Tree 的查询操作是一个递归过程,通过逐层查找直到叶子节点。这种策略可以在平均情况下保持 O(log n) 的时间复杂度,从而实现高效的数据检索。

相关文章:

MySQL索引(Index)

Index 数据库中的索引&#xff08;Index&#xff09;是一种数据结构&#xff0c;用于提高数据库查询性能和加速数据检索过程。索引可以看作是数据库表中某个或多个列的数据结构&#xff0c;类似于书中的目录&#xff0c;可以帮助数据库管理系统更快地定位和访问数据。它们是数…...

web框架面试题

1、Django 的生命周期&#xff1f; 前端发起请求nginxuwsgi中间件URLview视图通过orm与model层进行数据交互拿到数据返回给view试图将数据渲染到模板中拿到字符串中间件uwsginginx前端渲染 2、中间件的五种方法&#xff1f; process_requestprocess_responseProcess_viewPro…...

什么是字体堆栈(font stack)?如何设置字体堆栈?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是字体堆栈&#xff08;Font Stack&#xff09;&#xff1f;⭐ 如何设置字体堆栈&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 …...

推特群推王:引爆您的产品

作为出海市场的营销平台&#xff0c;Twitter的流量不断攀升&#xff0c;已然成为跨境贸易企业的一部分。当前&#xff0c;Twitter已不再是一个简单的社交平台&#xff0c;而是一个强大的营销平台&#xff0c;使企业能够与受众实时互动。然而&#xff0c;与其他社交媒体一样&…...

[JavaWeb]【七】web后端开发-MYSQL

前言&#xff1a;MySQL是一种流行的关系型数据库管理系统,它的作用是存储和管理数据。在Web开发中,MySQL是必备的数据库技能之一,因为它可以帮助Web开发人员处理大量的数据,并且提供了强大的数据查询和管理功能。 一 数据库介绍 1.1 什么是数据库 1.2 数据库产品 二 MySQL概述…...

C语言:初阶测试错题(查漏补缺)

题一&#xff1a;字符串倒置 示例1 输入 I like beijing. 输出 beijing. like I 思路一&#xff1a; 定义字符串数组arr[ ] ,利用gets()将要倒置的字符串输入&#xff0c;记录字符串长度len&#xff0c;此时写一个逆置函数Inversion()&#xff0c;第一步将整个字符串逆置&…...

数组累加器-reduce、reduceRight

数组累加器-reduce 一、基本语法1.reduce2.reduceRight 二、具体使用1.reduce2.reduceRight 三、使用场景1.数组求和2.数组求积3.计算数组中每个元素出现的次数 一、基本语法 1.reduce reduce() &#xff1a;对数组中的每个元素按序执行一个提供的 reducer 函数&#xff0c;每…...

uniapp 官方扩展组件 uni-combox 实现:只能选择不能手写(输入中支持过滤显示下拉列表)

uniapp 官方扩展组件 uni-combox 实现&#xff1a;只能选择不能手写&#xff08;输入中支持过滤显示下拉列表&#xff09; uni-comboxuni-combox 原本支持&#xff1a;问题&#xff1a; 改造源码参考资料 uni-combox uni-combox 原本支持&#xff1a; 下拉选择。输入关键字&am…...

TypeScript 语法

环境搭建 以javascript为基础构建的语言&#xff0c;一个js的超集&#xff0c;可以在任何支持js的平台中执行&#xff0c;ts扩展了js并且添加了类型&#xff0c;但是ts不能被js解析器直接执行&#xff0c;需要编译器编译为js文件&#xff0c;然后引入到 html 页面使用。 ts增…...

已经开源的中文大模型对比,支持更新

大模型下载&#xff1a;互链高科 ClueAI/PromptCLUE-base-v1-5 at main (huggingface.co) 支持多任务生成&#xff0c;支持中文&#xff0c;不支持多轮对话&#xff0c;体验&#xff1a;ClueAI (cluebenchmarks.com) 基于promptclue-base进一步训练的模型&#xff1a;ClueAI/Ch…...

调用其他页面onload函数的方法

在微信小程序中&#xff0c;可以通过以下方法来触发其他页面的 onLoad 函数执行&#xff1a; 使用全局事件订阅机制&#xff1a;在 App 实例中定义一个全局事件&#xff0c;在需要触发的地方发布该事件&#xff0c;在每个页面的 onLoad 函数中订阅该事件&#xff0c;并在回调函…...

视频怎么转换成gif表情包?三步完成视频在线转gif

小伙伴们在使用gif表情包的时候&#xff0c;都会注意到有些是视频片段&#xff0c;其实视频转换成gif动图已经很常见了&#xff0c;今天就来给大家演示一下使用视频转gif工具&#xff08;https://www.gif.cn&#xff09;来将视频在线转gif&#xff0c;一起来学习一下吧。 打开…...

ElasticSearch安装与介绍

Elastic Stack简介 如果没有听说过Elastic Stack&#xff0c;那你一定听说过ELK&#xff0c;实际上ELK是三款软件的简称&#xff0c;分别是Elasticsearch、 Logstash、Kibana组成&#xff0c;在发展的过程中&#xff0c;又有新成员Beats的加入&#xff0c;所以就形成了Elastic…...

每天一道leetcode:剑指 Offer 36. 二叉搜索树与双向链表(中等深度优先遍历递归)

今日份题目&#xff1a; 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 示例 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于…...

基于docker搭建pytest自动化测试环境(docker+pytest+jenkins+allure)

pytest搭建自动化测试环境&#xff08;dockerpytestjenkinsallure&#xff09; 这里我以ubuntu18为例 如果有docker环境&#xff0c;可以直接拉取我打包好的镜像docker pull ziyigun/jenkins:v1.0 1 搭建Docker 1.1 安装docker # 配置docker安装环境 sudo apt-get install ap…...

Debian 10驱动Broadcom 无线网卡

用lspci命令查询无线网卡品牌&#xff1a; 运行下面代码后&#xff0c;重启即可。 apt-get install linux-image-$(uname -r|sed s,[^-]*-[^-]*-,,) linux-headers-$(uname -r|sed s,[^-]*-[^-]*-,,) broadcom-sta-dkms...

系统架构设计师---2018年下午试题1分析与解答(试题二)

2018年下午试题1分析与解答 试题二 阅读以下关于软件系统建模的叙述,在答题纸上回答问题 1 至问题 3。 【说明】 某公司欲建设一个房屋租赁服务系统,统一管理房主和租赁者的信息,提供快捷的租赁服务。本系统的主要功能描述如下: 1. 登记房主信息。记录房主的姓名、住址…...

移远通信推出一站式Matter解决方案,构建智能家居开放新生态

近日&#xff0c;全球领先的S物联网整体解决方案供应商移远通信宣布&#xff0c;正式推出全新Matter解决方案&#xff0c;从模组、APP、平台、认证、生产五大层面为客户提供一站式服务&#xff0c;赋能智能家居行业加快融合发展。 过去十年&#xff0c;得益于物联网生态的发展&…...

文本挖掘 day5:文本挖掘与贝叶斯网络方法识别化学品安全风险因素

文本挖掘与贝叶斯网络方法识别化学品安全风险因素 1. Introduction现实意义理论意义提出方法&#xff0c;目标 2. 材料与方法2.1 数据集2.2 数据预处理2.3 关键字提取2.3.1 TF-IDF2.3.2 改进的BM25——BM25WBM25BM25W 2.3.3 关键词的产生(相关系数) 2.4 关联规则分析2.5 贝叶斯…...

laravel框架中批量更新数据

在php框架中 tp中就有批量更新封装好的 SaveAll 在laravel中有批量插入没有批量更新操作;因此我们可以自己去封装一个 然后批量进行更新操作 封装参考代码: /*** 批量更新** param $tableName 表名称* param string $pk 更新的字段* param array $multipleData 要更新的数据*…...

【Linux】POSIX信号量和基于环形队列的生产消费者模型

目录 写在前面的话 什么是POSIX信号量 POSIX信号量的使用 基于环形队列的生产消费者模型 写在前面的话 本文章主要先介绍POSIX信号量&#xff0c;以及一些接口的使用&#xff0c;然后再编码设计一个基于环形队列的生产消费者模型来使用这些接口。 讲解POSIX信号量时&#x…...

Rust之编写自动化测试

1、测试函数的构成&#xff1a; 在最简单的情形下,Rust中的测试就是一个标注有test属性的函数。属性 (attribute)是一种用于修饰Rust代码的元数据。只需要将#[test]添加到关键字fn的上一行便可以将函数转变为测试函数。当测试编写完成后,我们可以使用cargo test命令来运行测试…...

【网络】网络层——IP协议

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 网络层中&#xff0c;IP协议首部和有效载荷组成的完整数据称为数据报。 IP协议 &#x1f349;TCP和IP的…...

动力电池系统介绍(十三)——高压互锁(HVIL)

动力电池系统介绍&#xff08;十三&#xff09; 一、高压互锁梗概1.1 高压互锁原理1.1 高压互锁内部结构1.2 高压互锁分类1.3 高压互锁原则 二、高压互锁常见故障2.1 高压互锁开关失效2.2 端子退针导致开路2.3 互锁端子对地短路2.4 动力电池内部故障 三、高压互锁故障排查 一、…...

C# 一种求平方根的方法 立方根也可以 极大 极小都可以

不知道研究这些干啥&#xff0c;纯纯的浪费时间。。。 public static double TQSquare(double number){Random random1 new Random(DateTime.Now.Millisecond);double x1 0, resultX1 0, diff 9999999999, diffTemporary 0;for (int i 0; i < 654321; i){if (random1…...

爬虫逆向实战(十二)--某交易所登录

一、数据接口分析 主页地址&#xff1a;某交易所 1、抓包 通过抓包可以发现登录是通过表单提交的 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块&#xff0c;可以发现有两个加密参数password和execution 请求头是否加密&#xff1f; 无响应是…...

【C++入门到精通】C++入门 —— list (STL)

阅读导航 前言一、list简介1.概念2.特点 二、list的使用1.list的构造2.常见的操作⭕std::list类型的增、删、查、改 三、list与vector的对比温馨提示 前言 文章绑定了VS平台下std::list的源码&#xff0c;大家可以下载了解一下&#x1f60d; 前面我们讲了C语言的基础知识&…...

SOLIDWORKS有限元分析

SOLIDWORKS是一款广泛使用的三维计算机辅助设计软件&#xff0c;同时它还具有强大的有限元分析功能。有限元分析是一种工程分析方法&#xff0c;它将复杂的实体分解成许多小的有限元素&#xff0c;以便对其进行数学建模和分析。SOLIDWORKS的有限元分析功能可以帮助工程师预测和…...

Kotlin Flow 冷流

协程&#xff1a;Flow 1、Flow是什么&#xff1f; 处理异步事件流可取消&#xff1a;通过取消协程取消Flow组合操作符&#xff1a;复杂逻辑处理缓冲和背压&#xff1a;发送和接收时用不同速度处理&#xff0c;实现流量控制、避免数据丢失 2、传统事件处理方案&#xff1a;同…...

Android Socket使用TCP协议实现手机投屏

本节主要通过实战来了解Socket在TCP/IP协议中充当的是一个什么角色&#xff0c;有什么作用。通过Socket使用TCP协议实现局域网内手机A充当服务端&#xff0c;手机B充当客户端&#xff0c;手机B连接手机A&#xff0c;手机A获取屏幕数据转化为Bitmap&#xff0c;通过Socket传递个…...