MySQL 哈希索引、空间数据索引、全文索引

2023-10-27

1.哈希索引

哈希索引基于哈希表实现,仅支持精确匹配索引所有列的查询。对于每行数据,存储引擎都会对所有的索引列计算出一个哈希码。哈希索引将所有的哈希码存储在索引中,同时保存指向每个数据行的指针。

1.1 存储结构

常见的存储引擎中,MEMORY 存储引擎显式支持哈希索引。如果多个列的哈希值相同,哈希索引会以链表的方式存放多个记录指针到同一个哈希条目中。

以 customer 表为例,我们来看看索引是如何组织数据的存储的:

mysql> create table customer(
		 id int,
         last_name varchar(30),
		 first_name varchar(30),
		 birth_date date,
		 key idx1_customer(first_name) using hash
     ) ENGINE=MEMORY;
     
mysql> select * from customer;
+------+-----------+------------+------------+
| id   | last_name | first_name | birth_date |
+------+-----------+------------+------------+
|    1 | Allen     | Cuba       | 1960-01-01 |
|    2 | Barrymore | Julia      | 2000-05-06 |
|    3 | Basinger  | Viven      | 1979-01-24 |
+------+-----------+------------+------------+
3 rows in set (0.00 sec)

假设哈希索引使用哈希函数f(),返回的值如下:

f('Cuba')=1212

f('Julia')=5656

f('Viven')=2323

哈希索引的数据结构如下:
+-----------+-----------------------+
| 槽(Slot)  | 值(Value)              |
+-----------+-----------------------+
|      1212 | 指向第1行的指针          |
|      2323 | 指向第3行的指针          |
|      5656 | 指向第2行的指针          |
+-----------+-----------------------+

InnoDB 存储引擎也能支持哈希索引,但它所支持的哈希索引是自适应的。InnoDB 存储引擎会根据表的使用情况,在内存中基于 B-Tree 索引之上再创建一个哈希索引,这种行为是自动的、内部的行为,不能人为去干预是否在一张表中生成哈希索引。

1.2 适合哈希索引的查询类型

精确匹配所有列

和索引中的所有列进行精确匹配,如查找名字为Julia的客户。

数据库先会计算first_name='Julia’的哈希值5656,然后在索引中查找5656,找到对应的指针为:指向第2行的指针,最后根据指针从原表拿到具体值,并进行比较是否为Julia

mysql> explain select * from customer where first_name='Julia'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: customer
   partitions: NULL
         type: ref
possible_keys: idx1_customer
          key: idx1_customer
      key_len: 93
          ref: const
         rows: 2
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

1.3 哈希索引的限制

  • 哈希索引只支持等值查询,包括=、IN、<=>;
  • 哈希索引不存储字段值,只包含哈希值和行指针,不能使用索引中的值来避免读取行;
  • 哈希索引不是按照索引值顺序存储的,不能用于排序;
  • 哈希索引不支持部分索引列匹配查找,如在字段(last_name,first_name)创建哈希索引,此时需要查找last_name='Allen’的数据行,这种查询无法使用该哈希索引;
  • 哈希索引不支持范围查询,如查找所有姓氏在Allen和Bush之间的客户,这种查询无法使用哈希索引;
  • 如果出现很多哈希冲突(不同的索引列值有相同的哈希值),索引的维护成本是很高的,应尽量避免在选择性很低的字段上创建哈希索引。

2.空间数据索引 R-Tree

常见的存储引擎中,MyISAM 存储引擎支持空间索引,主要用作地理数据存储。空间索引会从所有维度来索引数据,查询时,可以使用任意维度来组合查询。这点和 B-Tree 索引不同,空间索引不需要前缀查询。MySQL 的 GIS 支持其实并不完善,一般情况并不建议在 MySQL 中使用空间索引。

3.全文索引

全文索引查找的是文本中的关键词,并不是直接比较索引中的值,它是一种特殊类型的索引。全文索引和其他索引的匹配方式完全不一样,更类似于搜索引擎,并不是简单的 where 条件匹配。

在相同的列上可以同时创建全文索引和 B-Tree 索引,全文索引适用于 match against 操作,不是简单的where 条件操作。

4.小结

本小节介绍了哈希索引、空间数据索引、全文索引这三种索引类型。重点介绍了哈希索引的存储结构、适合哈希索引的查询类型和相关限制。哈希索引仅支持精确匹配所有列的查询,在这种查询中,哈希索引是非常高效的,因为哈希索引存储的是哈希值,存储结构非常紧凑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 哈希索引、空间数据索引、全文索引 的相关文章

  • MySQL 错误“连接过多”

    我正在将 MySQL 5 0 用于由 GoDaddy linux 托管的网站 我正在对我的网络应用程序进行一些测试 突然我注意到页面刷新速度非常慢 最后 经过漫长的等待 我到达了一个页面 上面写着 MySQL 错误 连接太多 它指向我连接到
  • 导入mysql数据库出错

    我导出我的数据库并导出到另一台计算机使用 phpmyadmin 但它错误 静态分析 分析过程中发现2处错误 意想不到的角色 靠近位置 53 的 无法识别的语句类型 位置 1 的 div 附近 SQL查询 div class error h1
  • Navicat 中的 MySQL 视图 - 如何定义“主键”?

    当我在 Navicat 中定义视图时 经常会收到以下消息 xxx 没有主键 对此表的更新将使用以下伪语句完成 UPDATE xxx SET ModifiedFieldsAndValues WHERE AllFieldsAndOldValue
  • 选择列表包含非聚合列

    自从更新 MySQL 以来 我注意到以下查询失败 SELECT u p name as plan COUNT u id as totalprojects FROM users u LEFT JOIN plans p ON p id acce
  • 如何使用默认约束为mysql中的列创建随机数?

    DEFAULT 约束在接受字符串或当前日期值方面没有问题 我需要的是一个约束 每次创建实体时都会创建一个随机的 4 位数字 我尝试了以下代码 但它返回语法错误 ALTER TABLE client number ADD 代码 INT 4 D
  • 获取直方图数据

    有没有办法在 MySQL 中指定 bin 大小 现在 我正在尝试以下 SQL 查询 select total count total from faults GROUP BY total 生成的数据足够好 但行太多 我需要的是一种将数据分组
  • 如何在不违反唯一约束的情况下交换MySQL中两行的值?

    我有一个带有优先级列的 任务 表 它具有唯一的约束 我试图交换两行的优先级值 但我一直违反约束 我在类似的情况下在某个地方看到过这个语句 但不是 MySQL 的 UPDATE tasks SET priority CASE WHEN pri
  • PHP 7.0和MySQL启动错误“未定义符号:mysqlnd_allocator in Unknown”

    即使在运行时 在自定义编译版本的 PHP7 上也会收到此警告php v 尝试了发布的所有解决方案 什么可能导致这种情况 PHP 警告 PHP 启动 无法加载动态库 usr lib php 20151012 pdo mysql so usr
  • 从 MySQL 返回结果时的数字顺序

    我的数据库表中有以下类型的标题 Topic 1 blah blah Topic 2 blah blah Topic 3 blah blah Topic 10 blah blah Topic 11 blah blah etc 选择查询将始终返
  • java.sql.SQLException:已经关闭

    我们有一个在 Tomcat 上运行的 Web 应用程序 带有 MySQL 后端 有一段时间一切都很好 然后突然我们开始遇到这个异常java sql SQLException Already closed 整个堆栈跟踪是 DEBUG org
  • MySql 西班牙语字符数据

    我有一个包含西班牙语字符的数据库 为了填充数据库 我从字符编码 UTF 8 的客户端页面获取值 当我在 mySql 数据库中插入值时 行包含更改的数据 例如 如果我插入 M xico 数据库中的条目是 M xico 其影响是当我对指定 M
  • 需要 SQL 选择查询帮助

    我的问题类似于SQL选择组查询 https stackoverflow com questions 11407601 sql select group query 但模式发生了变化 我想要不同的结果 如下所述 给定链接的解决方案没有给我正确
  • UTF-8、PHP 和 XML Mysql

    我在解决这个问题时遇到了很大的问题 我有一个编码 latin1 swedish ci 的 mysql 数据库和一个存储名称和地址的表 我正在尝试输出 UTF 8 XML 文件 但在使用以下字符串时遇到问题 Otiv gen它被输出为Otiv
  • 无法将外键值插入链接表

    我目前正在尝试将数据插入名为的表中 客户报价 该表充当 顾客 表和 客户关税 桌子 它还记录通过以下方式提交数据的用户 user table 这是我的数据库的架构 https i stack imgur com gyCdb png http
  • 如何将UTF-8编码的汉字从MySql正确导出到SQL

    过去三天我们正在与严重的问题作斗争 我们从PhpmyAdmin导出MySql数据库文件 数据库条目中写入的数据是带有UTF 8字符集的中文 导出后将其转换为拉丁字符集 现在我们正在将此数据库SQl文件导入到其他主机 我们在UTF 8和排序规
  • mysql 将 varchar 字段排序为整数

    我的表中有一个 varchar 字段 我想对其进行排序 但我需要将此字段作为整数处理 意思是如果按文本排序 顺序是 19 2 20 但我想得到正确的顺序 2 19 20 谁能帮我 我不知何故没有设法运行查询CAST 我总是得到Error C
  • 如何使用Python的Mysqldb模块?而不是 %s 作为查询参数?

    MySqlDb 是一个很棒的 Python 模块 但有一个部分非常烦人 查询参数如下所示 cursor execute select from Books where isbn s isbn 而已知宇宙中的其他地方 oracle sqlse
  • MySql 5.7 函数 UUID() 默认排序规则 - 非法混合排序规则

    Problem MySQL uuid 默认排序规则与配置连接排序规则不进行比较 我有一个使用字符集创建的数据库 表 字段 utf 8和排序规则utf8 polish ci my cnf 如下 init connect SET NAMES u
  • MySQL - 查找与连接表中的所有行匹配的行

    表 1 曲目 表 2 词汇表 表 3 N M 轨道有单词 trackwords 找到包含所有单词的所有曲目 目前查询如下 SELECT DISTINCT t id FROM track as t Left Join trackwords a
  • 将我的本地数据库(Mysql)复制到远程数据库(phpmyadmin)

    My MySQL database local server is connected to a weather station The data are updated continuously on my local server My

随机推荐

  • python PyQt6学习笔记 有注释

    PyQt 当前日期和时间 from PyQt6 QtCore import QDate QTime QDateTime Qt now QDate currentDate print now print now toString Qt Dat
  • Winform使用DSO Framer控件嵌入office 异常总结及解决方法

    1 DSO Framer无法激活不可见或已禁用的控件 因为业务需求 执行了一次清空面板main panel所有控件 之后未向窗体面板main panel中添加过OfficeFramerControl 直接调用了OfficeFramerCon
  • "403 - 禁止访问: 访问被拒绝。 您无权使用所提供的凭据查看此目录或页面"的解决方案

    403 禁止访问 访问被拒绝 您无权使用所提供的凭据查看此目录或页面 的解决方案 打开IIS将此网站的默认文档设置一下即可解决 如果您的默认文档放在子文件夹中 可以在根目录下创建一个html文件跳转一下即可 跳转方法可以百度
  • 在卡内基梅隆大学 (Carnegie Mellon University) 就读是怎样一番体验?——Lina

    我觉得我无比适合回答这个问题 因为我是cmu里典型得一类人 我们来这里前 有着各种个样得背景 来了这里后 我们做了一个很重要的转变 学cs cmu是一个全民cs的地方 如果你在别的学校 你会看到ee的人问转cs难不难 在cmu 连学英语的人
  • 冒泡排序C++代码

    冒泡排序是一种比较简单的排序算法 它重复地走访过要排序的数列 一次比较两个元素 如果它们的顺序错误就把它们交换过来 走访数列的工作是重复地进行直到没有再需要交换 也就是说该数列已经排序完成 以下是 C 语言实现的冒泡排序代码 void bu
  • QLabel设置背景颜色或字体失效显示“无效样式表”解决办法

    点击ui中的label 右下角选择styleSheet添加样式表 样式表中 可以选择资源 改变背景颜色 改变字体 但是添加以后 显示样式表无效 如图 原因 无法识别资源类型 解决办法 添加资源类型 添加方法 1 点击每个按键的右上角箭头 选
  • js宏观任务和微观任务

    先来看这样一道面试题 async function async1 console log async1 start await async2 console log async1 end async function async2 cons
  • MySQL数据库函数与约束详解

    MySQL数据库函数与约束详解 MySQL数据库是一种功能强大的关系型数据库管理系统 提供了丰富的函数和约束来处理和保护数据 本篇博客将详细介绍MySQL数据库中的函数和约束 并提供实例演示其用法 函数 字符串函数 字符串拼接函数 CONC
  • 45度地图遮挡问题解决方案(cocos2d-x)

    最近一直在做45度斜视角游戏 也就是isometric等容地图 俗称2 5D 地图上物体的前后遮挡是我遇到的第一个问题 总结一下处理方法 遮挡问题 不知道术语 就是比如一个角色站在树后面 那么树要遮挡住角色的一部分 我是用实时修改zorde
  • Python神经网络:训练简单的分类器篇

    我们希望训练线性分类器 使其能够正确分类瓢虫或毛虫 在1 3节的图中 根据观察 我们知道要做到这一点 简单说来 就是要调整分界线的斜率 使其能够基于小虫的宽度和长度将两组点划分开来 我们如何做到这一点呢 我们无需研究一些最前沿的数学理论 让
  • 计算机操作鉴定所需设备,计算机操作员职业技能鉴定标准(高级)

    计算机操作员职业技能鉴定标准 一 职业概况 1 1 职业名称 计算机操作员 1 2 职业定义 使用电子计算机微机从事文字 图形 图像等信息处理工作及计算机系统操作 维护与管理的人员 1 3 职业等级 本职业共设三个等级 分别为初级 国家职业
  • 2014项目总结:一个比较失败的项目总结

    最近将会对今年所做的一些项目进行总结 里面基本都包含了一个项目所有的过程 一来为自己今年的年终总结提供些材料 其次也是希望在总结过程中能给自己带来些更多的启发和经验教训 同时也非常期望各位大牛能给些建议以及批评 让我获得更多的进步 谢谢 上
  • STL容器三 -- List 详解

    目录 目录 前言 一 STL List 的基本认识 1 1基本认识 1 2 list 双向迭代器 1 3一些list特有接口 二 模拟实现 2 1节点实现 2 2正向迭代器模板实现 2 2 1list迭代器 非原生指针的认识 2 2 2指针
  • 主流编程语言的底层实现是什么以及gcc,clang,llvm等编译器的区别

    文章目录 一 前言 二 c和c 和c 的区别 1 高级语言和低级语言 2 c 和 c 和 c 的区别 1 C语言 2 C 三 各主流语言的底层实现 1 python的底层实现 2 java的底层实现 3 php的底层实现 4 js的底层实现
  • .NET实现字符串base64编码

    using System using System Text using System IO using System Security using System Security Cryptography namespace Tgnet
  • 分页出现数据重复的解决方案

    用户量急剧上升中 偶尔会发现这么一个问题 就是下一页的数据中总会出现上一页的几条数据 为什么会造成这个问题呢 用户在查询第一页的时候 停留了一下 然后在这段时间内 又有两个用户注册了 然后请求第二页的数据的时候 排序的时候 两个新用户排在了
  • “kube-flannel.yml“: daemonsets.apps “kube-flannel-ds“ already exists

    Error from server AlreadyExists error when creating kube flannel yml podsecuritypolicies policy psp flannel unprivileged
  • 帝国cms【官方教程系列教程一】 首页模板制作

    帝国cms首页模板是指网站首页的模板 index html 修改首页模板 1 登录后台 单击 模板 菜单 选择 首页模板 子菜单 进入修改首页模板界面 2 进入修改首页模板界面 3 首页模板支持的变量说明 news url 网站地址 参数设
  • 存储器系统课后习题参考答案

    1 解释概念 主存 辅存 Cache RAM SRAM DRAM ROM PROM EPROM EEPROM CDROM Flash Memory 答 主存 主存储器 用于存放正在执行的程序和数据 CPU可以直接进行随机读写 访问速度较高
  • MySQL 哈希索引、空间数据索引、全文索引

    1 哈希索引 哈希索引基于哈希表实现 仅支持精确匹配索引所有列的查询 对于每行数据 存储引擎都会对所有的索引列计算出一个哈希码 哈希索引将所有的哈希码存储在索引中 同时保存指向每个数据行的指针 1 1 存储结构 常见的存储引擎中 MEMOR