MySQL-数据结构(索引)选择的合理性

  • MySQL衡量查询效率的标准就是磁盘IO次数(对索引的使用效率至关重要)
  • 加速查找速度的数据结构,基本分为以下两类
    • 树,增删改查的平均时间复杂度都是O(log2N)
    • 哈希(hash),增删改查的平均时间复杂度都是O(1)

1、哈希索引(Hash结构)

  • Hash本身就是一种(散列)函数,可以大幅度提升检索数据的效率

  • 是通过某种确定的算法将输入变为输出。相同的输入永远可以得到相同的输出。

  • 从效率来说Hash比B+树更快

  • 不适用性:

    • Hash索引仅能满足 = ,!= , in 的查询。如果进行范围查询,哈希型索引时间复杂度就会退化为O(n)
    • Hash型数据的存储是没有顺序的,在order by下,使用Hash索引还需要对数据重新排序
    • 基于联合索引,Hash值将联合索引键合并后一起计算,无法单独对一个键或多个索引键进行查询
    • 对等值查询来说,Hash索引效率更高,但索引列的重复值很多,效率会降低
  • 适用性:

    • 键值型(key-value)数据库中,如Redis(存储核心就是Hash表)
    • 经常需要等值查询的时候
    • 提供自适应Hash索引(如InnoDB中不支持Hash索引,当一些数据经常被访问满足一定条件时就会将数据页的地址存放到Hash表中)
  • 可以通过查看并配置 adaptive_hash_index 参数来设置是否开启自适应Hash。

mysql> show variables like '%adaptive_hash_index';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| innodb_adaptive_hash_index | ON    |
+----------------------------+-------+
1 row in set (0.01 sec)

2、二叉搜索树

磁盘IO的次数与树的高度相关
  • 特点:
    • 一个节点只能有两个子节点(节点度不能超过2)、
    • 左子节点<父节点<右子节点
  • 查找规则
    • 如果key大于根节点,则在右子树中进行查找
    • 如果key小于根节点,则在左子树中进行查找
    • 如果key等于根节点,则返回根节点

3、平衡二叉树(AVL索引)

在二叉树的基础上增加了相关约束
  • 左右两个子树的高度差的绝对值不能超过1,并且左右两个子树都是一颗平衡二叉树,时间复杂度O(log2N)
  • 常见平衡二叉树:
    • 平衡二叉搜索树
    • 红黑树
    • 树堆
    • 伸展树

4、B-Tree(多路平衡二叉树)

  • 每个节点可以包含M个子节点,M称为B-Tree的阶
  • 每个磁盘块中包含关键字子节点的指针(若磁盘块中包含X个关键字,则指针数为X+1)
  • 特性:
    • 根节点的子节点数的范围为[2,M]
    • 每个中间节点包含k-1个关键字和K个子节点,子节点的数量= 关键字的数量+1,k的取值范围为[ceil(M/2),M]
    • 叶子节点包括k-1个关键字(没有子节点),k的取值范围为:[ceil(M/2),M]
    • 所有叶子节点位于同一层

5、B+Tree(多路搜索树)

基于 B-Tree改进,B+Tree更适合文件索引系统
  • 特性:
    • 有k个子节点的节点就有k个关键字
    • 非叶子节点的关键字也会同时存在子节点中,并且是在子节点中所有关键字中最大(或最小)
    • 非叶子节点仅用于索引,不保留数据记录,跟记录相关的信息都放在叶子节点中(B-Tree中,非叶子节点既保存索引也保存数据记录)
    • 所有关键字都在叶子节点中出现,叶子节点构成一个有序链表,叶子节点本身按照关键字的大小从小到大顺序链接。

6、R树(存储高维数据的平衡树)

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

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

相关文章

Windows系统下修改文件夹和U盘图标实战

文章目录 知识学习一、修改磁盘图标第一步、新建.INF文件第二步、放置图标第三步、重新插入U盘第四步、隐藏与显示文件知识拓展 二、修改文件夹图标设置图标样式恢复图标样式 在日常办公中使用的是windows系统&#xff0c;系统默认的文件图标都一样&#xff0c;不利于分类整理&…

卡码55. 右旋字符串

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面 k 个字符移到字符串的前面&#xff0c;实现字符串的右旋转操作。 例如&#xff0c;对于输入字符串 "abcdefg…

电商核心技术揭秘52:数字化内容营销创新

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

【C++】继承 — 继承的引入、赋值切片详细讲解

前言 我们知道C语言是一门面向对象编程的语言&#xff0c;而面向对象编程有三大特性&#xff0c;它们分别是&#xff1a; 封装继承多态 目录 1. 继承的概念及定义1.1继承的概念1.2继承的定义格式1.3 继承的使用 2 基类和派生类对象赋值转换3 继承中的作用域3.1 派生类对象的存…

Linux下安装snaphu

1、官网下载安装包 2、解压&#xff0c;移动文件夹到/usr/local/下 3、在/usr/local/下创建man&#xff0c;在man下创建man1文件夹 4、进入到snaphu的src文件夹里&#xff0c;执行sudo make&#xff0c;如果报错 在这个 Makefile 中&#xff0c;-arch x86_64 是 macOS 特定的…

【Linux】-Linux用户和权限[3]

一、认知root用户 1、root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中&#xff0c;拥有最大权限的账户为&#xff1a;root&#xff08;超级管理员&#xff09; root用户拥有最大的系统操作权限…

Android MediaCodec 简明教程(七):使用 MediaCodec 解码到 OES 纹理上

系列文章目录 Android MediaCodec 简明教程&#xff08;一&#xff09;&#xff1a;使用 MediaCodecList 查询 Codec 信息&#xff0c;并创建 MediaCodec 编解码器Android MediaCodec 简明教程&#xff08;二&#xff09;&#xff1a;使用 MediaCodecInfo.CodecCapabilities 查…

【qt】QString字符串

前言&#xff1a; 这节很轻松&#xff0c;大家可以放心食用 ♪(&#xff65;ω&#xff65;)&#xff89; QString目录 一.与cString的区别二.隐式共享三.初始化四.判断是否为空串五.字符串的长度六.添加字符串1.尾加2.任意位置加 七.替换字符串八.修改字符串九.删除字符串1.清…

【C语言项目】贪吃蛇(上)

个人主页 ~ gitee仓库~ 欢迎大家来到C语言系列的最后一个篇章–贪吃蛇游戏的实现&#xff0c;当我们实现了贪吃蛇之后&#xff0c;我们的C语言就算是登堂入室了&#xff0c;基本会使用了&#xff0c;当然&#xff0c;想要更加熟练地使用还需要多多练习 贪吃蛇 一、目标二、需要…

(八)JSP教程——application对象

application对象是一个比较重要的对象&#xff0c;服务器在启动后就会产生这个application对象&#xff0c;所有连接到服务器的客户端application对象都是相同的&#xff0c;所有的客户端共享这个内置的application对象&#xff0c;直到服务器关闭为止。 可以使用application对…

MGRE 实验

需求&#xff1a;1、R2为ISP&#xff0c;其上只能配置IP地址。 2、R1-R2之间为HDLC封装 3、R2-R3之间为ppp封装&#xff0c;pap认证&#xff0c;R2为主认证方。 4、R2-R4之间为ppp封装&#xff0c;chap认证&#xff0c;R2为主认证方。 5、R1、R2、R3构建MGRE环境&#xff0…

sourceTree push失败

新电脑选择commit and push&#xff0c;报错了&#xff0c;不过commit成功&#xff0c;只不过push失败了。 原因是这个&#xff0c;PuTTYs cache and carry on connecting. 这里的ssh选择的是 PuTTY/Plink&#xff0c;本地没有这个ssh密钥&#xff0c;改换成openSSH&#xff…

DEV--C++小游戏(吃星星(0.1))

目录 吃星星&#xff08;0.1&#xff09; 简介 头文件 命名空间变量 副函数 清屏函数 打印地图函数 移动函数 主函数 0.1版完整代码 吃星星&#xff08;0.1&#xff09; 注&#xff1a;版本<1为未实现或只实现部分 简介 用wasd去吃‘*’ 头文件 #include<bi…

各种索引地址

直接索引&#xff0c;一级间接索引&#xff0c;二级间接索引 【软考】解析直接地址索引和间接地址索引_直接地址索引和一级地址索引-CSDN博客 系统架构设计师真题解析&#xff08;1&#xff09;—— 文件系统物理结构_文件系统采用索引节点管理-CSDN博客 磁盘块&#xff0c…

Windows电脑搭建HarmonyOS NEXTDeveloper Preview2环境详解

Windows电脑搭建HarmonyOS NEXTDeveloper Preview2环境详解&#xff1a; HarmonyOS NEXT Preview系列教程基于Api11讲解-IT营大地老师 1 、电脑要求以及注意事项 操作系统 &#xff1a; Windows10 64 位、 Windows11 64 位 内存 &#xff1a; 8GB 及以上&#xff0c;推荐 16G…

AI中LangChain原理以及快速上手

AI中LangChain原理以及快速上手 什么是LangChain&#xff1f; LangChain是一种基于语言模型的自然语言处理技术&#xff0c;它可以将自然语言转换为向量表示&#xff0c;从而实现对自然语言的理解和处理。LangChain的核心思想是将自然语言中的每个单词或短语映射到一个高维向…

新火种AI|AI让大家都变“土”了!

作者&#xff1a;一号 编辑&#xff1a;美美 AI不仅要把人变“土”&#xff0c;还要把人变多样。 这个世界&#xff0c;终究是变“土”了。 今年五一假期&#xff0c;一个名为“Remini”的AI修图APP火遍了全网。注意&#xff0c;是Remini&#xff0c;而不是Redmi&#xff0…

Redis学习汇总

目录 1.Linux环境下安装redis 2.redis的数据结构及命令 3.redis.conf配置文件常用配置 3.redis的事务操作 4.redis实现乐观锁 5.通过jedis操作redis 6.Springboot集成redis 7.自定义一个RedisTemplate 8.持久化策略 RDB和AOF 9.redis集群环境搭建 10.哨兵模式 11.缓…

java集合中retainAll方法使用注意

java集合中retainAll方法使用注意 retainAll新的改变 retainAll retainAll()方法被用来找出两个集合的共同元素&#xff0c;并且只会在交集不为空的情况下返回true。通过比较操作前后集合的大小是否有变化&#xff0c;我们可以确定是否存在共同元素。 retainAl()方法会改变原集…

ES:基础查询语法(简单易懂)

一、基础查询语句的结构&#xff1a; GET http://ip:prot/textbook/_search GET { "query" : { ...query子句... }, "aggs" : { ..aggs子句.. }, "sort" : { ..sort子句.. } "from" : 0, // 返回搜索结果的开始位置 &…