【Mysql索引数据结构与算法】

news2024/10/1 5:37:37

mysql索引数据结构
脑图链接

一、索引

什么是索引

索引指的是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中的数据。类似于书籍的目录,用于快速定位到所需内容、数据的页码位置。
优点:提高数据检索的效率,降低数据库的IO成本
缺点:维护索引要耗费时间和额外的磁盘空间 ,并且随着数据量的增加,所耗费的时间也会增加

索引分类

索引一般可以分为四类
● 单列索引:单列索引指的是只包含一列的索引,又可分为三种:
○ 普通索引:普通索引是最基本的索引类型,没有什么限制,且允许空值和重复值。
○ 唯一索引:唯一索引列中的值必须是唯一的,允许存在一个空值。多个空值仍然会视为重复
○ 主键索引:主键索引是特殊的唯一索引,不允许存在空值。
● 联合索引:组合索引也就是多列索引,由多列组合创建的索引,使用的时候遵循最左前缀原则。
● 全文索引:全文索引只有MyISAM引擎支持,且只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,主要用于做文章的关键字搜索的
● 空间索引:空间索引是对空间数据类型的字段建立的索引

二、索引数据结构

B Tree

特点:
● 叶节点具有相同的深度,叶节点的指针为空
● 所有索引元素不重复
● 节点中的数据索引从左到右递增排列
B Tree

B+Tree

特点:
● 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
● 叶子节点包含所有索引字段
● 叶子节点用指针连接,提高区间访问的性能
B+ Tree

Hash

特点:
● 对索引的key进行一次hash计算就可以定位出数据存储的位置
● 很多时候Hash索引要比B+ 树索引更高效
● 仅能满足 “=”,“IN”,不支持范围查询
● hash冲突问题
在这里插入图片描述

R Tree

R-Tree在MySQL很少使用,仅支持 geometry数据类型 ,支持该类型的存储引擎只有myisam、bdb、innodb、ndb、archive几种。
举个R树在现实领域中能够解决的例子:查找20英里以内所有的餐厅。如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中,一个字段记录经度,另一个字段记录纬度。这样的话我们就需要遍历所有的餐厅获取其位置信息,然后计算是否满足要求。如果一个地区有100家餐厅的话,我们就要进行100次位置计算操作了,如果应用到谷歌、百度地图这种超大数据库中,这种方法便必定不可行了。R树就很好的解决了这种高维空间搜索问题。它把B树的思想很好的扩展到了多维空间,采用了B树分割空间的思想,并在添加、删除操作时采用合并、分解结点的方法,保证树的平衡性。
R树就是一棵用来存储高维数据的平衡树 。相对于B-Tree,R-Tree的优势在于范围查找

三、聚簇索引与非聚簇索引

聚簇索引

innoDB引擎下主键索引
○ 索引和数据存放在同一个文件中
○ 通过索引树遍历到叶子结点可以查询到完整数据
优点:数据访问更快,索引和数据保存在同一个B+Tree中
缺点:
○ 插入速度严重依赖于插入顺序 ,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键(为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?)
○ 更新主键的代价很高 ,因为将会导致被更新的行移动
在这里插入图片描述

非聚簇索引

索引文件与数据文件分开存储,通过索引树遍历到叶子节点查询到主索引树的索引,通过主索引树索引回表查询到完整数据
优点:索引覆盖的情况下数据访问快
缺点:需要进行回表查询
在这里插入图片描述

四、联合索引解析

怎么使用联合索引

在建立索引的时候,尽量在多个单列索引上判断下是否可以使用联合索引。联合索引的使用不仅可以节省空间,还可以更容易的使用到索引覆盖(查询字段被联合索引字段覆盖,查询联合索引树就可以拿到需要数据,不再需要回表查询)。

联合索引数据结构

在这里插入图片描述

最左前缀匹配原则

最左优先,以最左边的为起点任何 连续 的索引都能匹配上,但遇到范围查询 (>、<、between、like) 就会停止匹配。之所以会有最左前缀匹配原则和联合索引的索引构建方式及存储结构是有关系的,联合索引是使用多列索引的第一列(最左)构建的 B+ Tree

测试建表及数据sql

create table user
(
  id   int auto_increment
  primary key,
  age  int         not null comment '年龄',
  name varchar(50) not null comment '姓名',
  hobby int    comment '爱好',
  sex  int         not null comment '0-未知 1男 2女'
);
create index index_name_sex_age on user (name, sex, age);
INSERT INTO user (id, age, name, sex, hobby) VALUES (1, 18, 'zk', 1, 1);
INSERT INTO user (id, age, name, sex, hobby) VALUES (2, 28, 'xuan', 1, 1);
INSERT INTO user (id, age, name, sex, hobby) VALUES (3, 28, 'whk', 1, 2);
INSERT INTO user (id, age, name, sex, hobby) VALUES (4, 18, '赵美美', 2, 2);
INSERT INTO user (id, age, name, sex, hobby) VALUES (5, 40, '李mm', 0, 1);
INSERT INTO user (id, age, name, sex, hobby) VALUES (6, 1, 'bb', 0, 1);
INSERT INTO user (id, age, name, sex, hobby) VALUES (7, 30, 'xuan', 1, 1);

explain -- 走索引
select * from whk_db.user a where  a.name='zk';
explain -- 走索引
select * from whk_db.user a where  a.name='zk' and a.sex=1;
explain -- 不走索引,不满足最左前缀
select * from whk_db.user a where  a.age=18 ;
explain -- 走索引
select * from whk_db.user a where  a.name='zk' and a.sex=1 and a.age<20;
explain -- 走索引
select * from whk_db.user a where  a.name='zk' and a.age=18 and a.hobby=1;

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

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

相关文章

TC8:UDP_FIELDS_06-10

UDP_FIELDS_06: Fields - Total Length 目的 验证DUT发送的UDP报文的Total Length字段的正确性 测试步骤 Tester:让DUT发送UDP消息,数据大小为udpUserDataSizeTester:监听在DIface-0上DUT:发送消息Tester:验证接收到的UDP消息的Total Length字段的值为udpUserDataSize+8期…

Ansys Zemax | 内窥镜物镜系统初始结构的优化提升(上)

概述 本文分为内窥镜系统简介、主要结构、系统分析、性能提升和总结五个部分&#xff0c;介绍了内窥镜系统的主要结构&#xff0c;并讨论了如何在 OpticStudio 中根据内窥镜物镜系统的初始结构进行像差分析&#xff0c;以及如何对其进行后续的优化提升。(联系我们获取文章附件…

【设计模式】SpringBoot优雅使用策略模式

文章目录 1.概述1.1.简述策略模式 2.实现方法2.1.实现思路2.2.实现代码2.3.策略拓展2.4.执行调用 3.总结 1.概述 本篇文章主要会描述SpringBoot与策略模式的结合使用&#xff0c;因为不涉及到理论部分&#xff0c;所以在阅读本篇之前&#xff0c;需要对策略模式的理论已经有了…

<C++> C++11 新的类功能

C11 新的类功能 1.默认成员函数 原来C类中&#xff0c;有6个默认成员函数&#xff1a; 构造函数析构函数拷贝构造函数拷贝赋值重载取地址重载const取地址重载 最后重要的是前4个&#xff0c;后两个用处不大。默认成员函数就是我们不写编译器会生成一个默认的。 C11 新增了两…

大家知道什么是CDN吗?对网站有什么帮助?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是CDN&#xf…

【Python 随练】自由落体运动

题目&#xff1a; 一球从 100 米高度自由落下&#xff0c;每次落地后反跳回原高度的一半&#xff1b;再落下&#xff0c;求它在第 10 次落地时&#xff0c;共经过多少米&#xff1f;第 10 次反弹多高&#xff1f; 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个物…

华为OD机试之阿里巴巴找黄金宝箱(IV)(Java源码)

阿里巴巴找黄金宝箱(IV) 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0-N的箱子&#xff0c;每个箱子上面有一个数字&#xff0c;箱子排列成一个环&#xff0c;编号最大的箱子的下一个是编号为0的箱子。…

[进阶]网络通信:概述、IP地址、InetAddress

什么是网络编程&#xff1f; 可以让设备中的程序与网络上其他设备中的程序进行数据交互&#xff08;实现网络通信的&#xff09;。 Java提供的网络编程解决方案就是在java.net.*包下进行网络编程。 基本的通信架构 基本的通信架构有2种形式&#xff1a;CS架构&#xff08;Cl…

C++IO流和类型处理(11)

IO流 IO流包括 标准IO流&#xff0c;字符串流&#xff0c;文件流 标准IO流 基础使用 #include <iostream> //包括istream和ostream cin >> ----- 标准输入 cout<< ----- 标准输出 clog<< ----- 带缓冲区的标准错误 cerr<< ----- 不带缓冲…

lazada、速卖通、煤炉、eBay 、亚马逊测评环境系统:如何掌握核心养号技巧?

作为一个准备跨足测评行业的业者&#xff0c;或是一个正在考虑将电商业务转向测评服务的卖家&#xff0c;一份详尽的养号指南绝对是你不可错过的知识宝库。 跨境电商平台无疑是巨大的数据中心&#xff0c;它们不仅检测你的设备参数和IP&#xff0c;还分析你的购物习惯&#xf…

mapbox-gl 点位编辑功能

文章目录 前言方式一&#xff1a;借助 Marker添加自定义icon添加POI图层&#xff0c;绑定对应事件基于Marker交互创建自定义Marker编辑 / 创建POI 方式二&#xff1a;采用 mapbox-gl-draw 插件总结 前言 矢量在线编辑是gis常用的编辑功能&#xff0c;兴趣点&#xff08;POI&am…

力扣算法练习(一)

目录 1. 两数相加&#xff08;2&#xff09; 2. 寻找两个正序数组的中位数&#xff08;4&#xff09; 1. 两数相加&#xff08;2&#xff09; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储…

MySQL 中的常用函数详解

0️⃣前言 MySQL是一种常用的关系型数据库管理系统&#xff0c;它提供了许多内置函数来处理数据。本文将介绍MySQL中的各种常用函数&#xff0c;包括字符串函数、日期函数、数学函数、聚合函数等。 文章目录 0️⃣前言1️⃣字符串函数1.1CONCAT函数1.2SUBSTRING函数1.3REPLACE函…

高级SQL语句1

高级SQL语句 建立实验环境高级语句1.---- SELECT ----显示表格中一个或数个字段的所有数据记录2.---- DISTINCT ----不显示重复的数据记录3.---- WHERE ----有条件查询4.---- AND OR ----且 或 &#xff08;一般配合where使用&#xff09;5.---- IN ----显示已知的值的数据记录…

私家云二代/比特米盒安装Armbian Blueseye到Emmc

快捷导航 私家云二代/比特米盒安装Armbian Blueseye到Emmc设备介绍前期准备硬件清单Windows电脑一台Type-C数据线一根U盘或SD卡一个键盘一把显示器HDMI数据线 软件清单Amlogic USB Burning ToolUSB烧录工具SSH工具 下载清单Amlogic刷机工具USB烧录工具ATV6.imgDTB文件BIN文件切…

Spring Security OAuth2授权原理、流程与源码解读

文章目录 前言AuthorizationServerConfigurerAdapter(身份认证服务配置适配器)OAuth2AuthorizationServerConfiguration(OAuth2授权服务配置) EnableAuthorizationServer(开启身份认证服务)AuthorizationServerEndpointsConfigurations身份认证服务站点配置类AuthorizationEndp…

HITSZ嵌入式计算(研)23年Keil模拟器项目解决方案

HITSZ嵌入式计算&#xff08;研&#xff09;23年Keil模拟器项目解决方案 1. 项目介绍2. Keil安装3. 创建新项目3.1 参考博文3.2 流程 4. 发送串口数据4.1 参考博文4.2 串口收发流程 5. 产生波形5.1 头文件封装5.2 初始化GPIO口5.3 产生并观察方波 6. Keil信号函数和中断6.1 中断…

佩戴舒适的蓝牙耳机有哪些品牌?不伤耳的蓝牙耳机推荐

​真无线蓝牙耳机逐渐成为大家日常必不可少的数码产品&#xff0c;也随着耳机的发展&#xff0c;人们对蓝牙耳机的要求也越来越高&#xff0c;不仅音质要好&#xff0c;长时间佩戴也要舒适&#xff0c;更是能够应用于多种场景中使用&#xff0c;但挑选蓝牙耳机也是一门学问&…

kettle开发-Day38-超好用自定义数据处理组件

目录 前言&#xff1a; 一、半斤八两&#xff0c;都不太行 1、表输入&#xff0c;速度快&#xff0c;但不稳妥 2、稳的一批&#xff0c;但是慢的像蜗牛 二、各诉衷肠&#xff0c;合作共赢 1、表输入&#xff0c;高效数据插入 2、插入更新&#xff0c;一个都不能少 三、表输…

## flink- mysql同步数据至starrocks-2.5.0之数据同步

flink- mysql同步数据至starrocks-2.5.0之数据同步 mysql 创建 表 CREATE TABLE t_user (id bigint NOT NULL AUTO_INCREMENT,user_name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,age int DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB…