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

索引类型-哈希索引

一. 前言

前面我们简单介绍了数据库的B-Tree索引,下面我们介绍另一种索引类型-哈希索引。

二. 哈希索引的简介

哈希索引(hash index) 基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且在不同键值的行计算出来的码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。

在Mysql中,只有Memory引擎显示支持哈希索引。是它默认的存储引擎。值得注意的是,Memory引擎是支持非唯一哈希索引的。如果多个列的哈希值相同,索引会以链表的方式存放多个记录指针到同一个哈希条目中。

三. 案例说明

  1. 建表语句
CREATE TABLE testhash (fname VARCHAR ( 50 ) NOT NULL,Iname VARCHAR ( 50 ) NOT NULL,KEY USING HASH ( fname )
) ENGINE = MEMORY;
  1. 插入语句
INSERT INTO `test`.`testhash` (`fname`, `Iname`) VALUES ('Aerjen', 'Lentz');
INSERT INTO `test`.`testhash` (`fname`, `Iname`) VALUES ('Baron', 'Schwartz');
INSERT INTO `test`.`testhash` (`fname`, `Iname`) VALUES ('Peter', 'Zaitsev');
INSERT INTO `test`.`testhash` (`fname`, `Iname`) VALUES ('Vadim', 'Tkachenko');
  1. 数据内容
SELECT * from testhash

在这里插入图片描述

假设索引使用假想的哈希函数 f(), 他返回下面的值(都是示例数据,非真实数据)
f(‘Arjen’) = 2323
f(‘Baron’) = 7437
f(‘Peter’) = 8784
f(‘Vadim’) = 2458

则哈希索引的数据结构如下:
在这里插入图片描述

哈希查找方式
注意每个槽的编号是顺序的,但是数据行不是。

  1. 搜索方式
SELECT Iname FROM testhash WHERE fname = 'Peter'

Mysql 先计算 ‘Peter’的哈希值,并使用该值寻找对应的记录指针。因为 f(‘Peter’) = 8784, 所以Mysql 在索引中查找8784,可以找到指向第3行的指针,最后一步就是比较第三行的值是否为’Peter’,以确保就是要查找的行。

四. 哈希索引的优缺点

优点:

  • 索引自身只需存储对应的哈希值,所以索引的结构十分紧凑,这也让哈希索引查找速度非常快。
  • 访问哈希索引的数据非常快,除非有很多哈希冲突。(不同的索引列值却有相同的哈希值)。当出现哈希冲突的时候,存储引擎必须遍历链表中所有的行指针,逐行进行比较,直到找到结果.

缺点:

  • 哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中的行速度很快,所以大部分情况下这一影响并不明显。
  • 哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序
  • 哈希索引页不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。例如, 在数据列(A,B) 上建立哈希索引,如果查询只有数据列A,则无法使用该索引。
  • 哈希索引只支持等值比较查询,包括 =, IN(), <=>。它也不支持任何范围查询,例如 WHERE price > 100

五. InnoDB中的哈希索引

1. 简介

InnoDB 引擎有一个特殊的功能叫做"自适应哈希索引"。当InnoDB 注意到某些索引值被使用得非常频繁时,它会在内存中基于 B-Tree 索引之上创建一个哈希索引,这样就让B-Tree索引也具有哈希索引的一些优点,比如快速的哈希查找。这是一个完全自动的,内部的行为,用户无法控制或者配置,不过如果有必要,完全可以关闭该功能。

2. 案例说明

如果表中存储了大量的URL,并需要根据URL 进行搜索查找。如果使用 B-Tree来存储URL,存储的内容就会很大,因为URL本身都很长。正常情况下会有如下查询:

SELECT id FROM url WHERE url = 'http://www.mysql.com';

若删除原来的URL列上的索引,而新增一个被索引的 url_crc列,使用 CRC32做哈希,就可以使用下面的方式查询:

SELECT id FROM url WHERE url = 'http://www.mysql.com'
AND url_crc=CRC32("http://www.mysql.com");

这样做的性能会非常高,因为Mysql优化器会使用这个选择性很高而体积很小的基于 url_crc 列的索引来完成查找。即使有多个记录有相同的索引值,查询仍然很快,只需要根据哈希值做快速的整数比较就能找到索引条目,然后一一比较返回对应的行。这比直接通过url做B-Tree索引要快的多。

相关文章:

索引类型-哈希索引

一. 前言 前面我们简单介绍了数据库的B-Tree索引&#xff0c;下面我们介绍另一种索引类型-哈希索引。 二. 哈希索引的简介 哈希索引(hash index) 基于哈希表实现&#xff0c;只有精确匹配索引所有列的查询才有效。对于每一行数据&#xff0c;存储引擎都会对所有索引列计算一个…...

uniapp中组件库的Textarea 文本域的丰富使用方法

目录 #平台差异说明 #基本使用 #字数统计 #自动增高 #禁用状态 #下划线模式 #格式化处理 API #List Props #Methods #List Events 文本域此组件满足了可能出现的表单信息补充&#xff0c;编辑等实际逻辑的功能&#xff0c;内置了字数校验等 注意&#xff1a; 由于…...

LLM、AGI、多模态AI 篇三:微调模型

文章目录 系列LLM的几个应用层次Lora技术其他微调技术FreezeP-TuningQLoRA指令设计构建高质量的数据微调步骤系列 LLM、AGI、多模态AI 篇一:开源大语言模型简记 LLM、AGI、多模态AI 篇二:Prompt编写技巧 LLM、AGI、多模态AI 篇三...

IPC之十二:使用libdbus在D-Bus上异步发送/接收信号的实例

IPC 是 Linux 编程中一个重要的概念&#xff0c;IPC 有多种方式&#xff0c;本 IPC 系列文章的前十篇介绍了几乎所有的常用的 IPC 方法&#xff0c;每种方法都给出了具体实例&#xff0c;前面的文章里介绍了 D-Bus 的基本概念以及调用远程方法的实例&#xff0c;本文介绍 D-Bus…...

ES6之生成器(Generator)

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…...

Matlab技巧[绘画逻辑分析仪产生的数据]

绘画逻辑分析仪产生的数据 逻分上抓到了ADC数字信号,一共是10Bit,12MHZ的波形: 这里用并口协议已经解析出数据: 导出csv表格数据(这个数据为补码,所以要做数据转换): 现在要把这个数据绘制成波形,用Python和表格直接绘制速度太慢了,转了一圈发现MATLAB很好用,操作方法如下:…...

Go面试题学习

1.并发安全性 Go语言中的并发安全性是什么&#xff1f;如何确保并发安全性&#xff1f; 并发安全性是指在并发编程中&#xff0c;多个goroutine对共享资源的访问不会导致数据竞争和不确定的结果。 使用互斥锁&#xff08;Mutex&#xff09;&#xff1a;通过使用互斥锁来保护…...

SQL效率-查询条件需避免使用函数处理索引字段

一个sql效率的问题 问题 假设created_at 是date类型、是索引&#xff0c;那么以下2种方式有没效率差异&#xff1a; WHERE TO_CHAR(created_at, ‘YYYY-MM-DD’) ‘2020-02-01’WHERE created_at TO_DATE(‘2020-02-01’ , ‘YYYY-MM-DD’) DBA回复 有的&#xff0c;第一…...

【Spring 篇】Spring:轻松驾驭 Java 世界的利器

在 Java 开发领域&#xff0c;Spring 框架无疑是一颗璀璨的明星&#xff0c;它不仅提供了全面的企业级特性&#xff0c;还为开发者提供了简便而强大的开发方式。本文将深入探讨 Spring 框架的简介、配置和快速入门&#xff0c;带你轻松驾驭 Java 世界的利器。 Spring 简介 Sp…...

八个LOGO素材网站推荐分享

即时设计资源广场 在UI界面设计中&#xff0c;为了找到合适的图标icon&#xff0c;你有没有尝试过翻遍整个网络&#xff0c;找到自己想要的&#xff0c;却无法下载或收费使用&#xff1f;最后&#xff0c;只收集图标icon材料需要半天时间。专业设计师使用的图标icon设计材料“…...

React格式化规范

React并没有特定的格式要求&#xff0c;它允许开发者根据自己的喜好和项目需求来选择代码的格式化风格。然而&#xff0c;在React社区中有一些常见的约定和最佳实践&#xff0c;以下是一些常用的格式化规范和建议&#xff1a; 缩进&#xff1a;使用2个或4个空格来进行缩进&…...

如何利用Conda管理多种虚拟环境与Jupyter Notebook内核切换

写在开头 在数据科学与机器学习领域,项目之间可能存在不同的依赖关系和版本要求。为了有效管理这些差异,使用虚拟环境成为一种标准实践。本文将介绍如何利用Conda这一强大的环境管理工具,结合Jupyter Notebook,使得在不同项目之间灵活切换变得轻而易举。 2. Conda简介 2…...

博客摘录「 什么是QPS、TPS、吞吐量?- 高并发名词概念」2024年1月5日

1.什么是高并发&#xff1f; 高并发&#xff08;High Concurrency&#xff09;。通常是指系统在短时间内的大量操作。 高并发相关的常见指标有&#xff1a;QPS、TPS、吞吐量、并发数等。 2.QPS&#xff08;Query Per Second&#xff09; QPS每秒查询率&#xff0c;是指系统…...

PTA——逆序的三位数

程序每次读入一个正3位数&#xff0c;然后输出按位逆序的数字。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如输入700&#xff0c;输出应该是7。 输入格式&#xff1a; 每个测试是一个3位的正整数。 输出格式&#xff1a; 输出按位逆序…...

ChatGPT怎么帮我上班的

1.解放生产力 1&#xff09;标准格式&#xff0c;完美输出。GPT对于公文等具有一定标准格式的文件&#xff0c;可以进行完美仿写&#xff0c;随随便便以假乱真那都是小菜一碟&#xff0c;这对于经常要开展规范成文的人来说&#xff0c;简直就是个福音&#xff0c;只要前期调教…...

WPF 漂亮长方体、正文体简单实现方法 Path实现长方体 正方体方案 WPF快速实现长方体、正方体的方法源代码

这段XAML代码在WPF中实现了一个类似长方体视觉效果的图形 声明式绘制&#xff1a;通过Path、PathGeometry和PathFigure等元素组合&#xff0c;能够以声明方式精确描述长方体每个面的位置和形状&#xff0c;无需编写复杂的绘图逻辑&#xff0c;清晰直观。 层次结构与ZIndex控制…...

Nginx(十三) 配置文件详解 - 反向代理(超详细)

本篇文章主要讲ngx_http_proxy_module和ngx_stream_proxy_module模块下各指令的使用方法。 1. 代理请求 proxy_pass 1.1 proxy_pass 代理请求 Syntax: proxy_pass URL; Default: — Context: location, if in location, limit_except 设置代理服务器的协议和地址以…...

谷歌浏览器启用实时字幕功能

在 Chrome 中使用“实时字幕”功能 - Google Chrome帮助 在 Chrome 中使用“实时字幕”功能 从计算机上的 Chrome 浏览器中&#xff0c;您可以使用“实时字幕”功能自动为视频、播客、游戏、直播、视频通话或其他音频媒体生成字幕。音频和字幕均在本地处理&#xff0c;并会保…...

php接口优化 使用curl_multi_init批量请求

PHP使用CURL同时抓取多个URL地址 抓取多个URL地址是Web开发中常见的需求&#xff0c;使用PHP的curl库可以简化这个过程。本文将详细介绍如何使用PHP的curl库同时请求多个URL地址&#xff0c;并提供具体的代码案例和注释。 curl库介绍 curl是一个常用的开源网络传输工具&…...

联邦拜占庭共识算法的工作流程

1 前言 联邦拜占庭共识算法&#xff08;Federated Byzantine Agreement&#xff0c;简称FBA&#xff09;是一种解决分布式系统中拜占庭问题的共识算法&#xff0c;是拜占庭容错共识算法里的其中一种&#xff0c;主要应用于区块链技术中。这种算法允许系统内部的各种节点自由进…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...