当前位置:首页 > 编程技术 > 正文内容

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

yc8882年前 (2023-02-26)编程技术786

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

本小节重点介绍哈希索引、空间数据索引、全文索引。

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')=1212f('Julia')=5656f('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: refpossible_keys: idx1_customer
          key: idx1_customer
      key_len: 93
          ref: const
         rows: 2
     filtered: 100.00
        Extra: NULL1 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.小结

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


本站发布的内容若侵犯到您的权益,请邮件联系站长删除,我们将及时处理!


从您进入本站开始,已表示您已同意接受本站【免责声明】中的一切条款!


本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行研究。


本站资源仅供学习和交流使用,版权归原作者所有,请勿商业运营、违法使用和传播!请在下载后24小时之内自觉删除。


若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。


本文链接:https://www.10zhan.com/biancheng/10608.html

标签: mysql
分享给朋友:

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

【说站】用一句话就可以去除宝塔面板操作上的二次验证

【说站】用一句话就可以去除宝塔面板操作上的二次验证

用过宝塔的朋友应该都会发现,现在宝塔面板有些鸡肋的功能,删除文件、删除数据库、删除站点等操作都需要做计算题!不仅加了几秒的延时等待,还无法跳过!这时候就会有朋友在想,如何去除宝塔面板的二次验证,此篇文...

【说站】利用Webhook实现Java项目自动化部署

【说站】利用Webhook实现Java项目自动化部署

用webhook就能实现Java项目自动部署,其实原理很简单。费话不多说,直接往下看教程。1. 创建gitee仓库并初始化2. 在linux安装git3. 在宝塔的软件的商店里下载Webhook4....

【说站】vagrant实现linux虚拟机的安装并配置网络

【说站】vagrant实现linux虚拟机的安装并配置网络

一、VirtualBox的下载和安装1、下载VirtualBox官网下载:https://www.virtualbox.org/wiki/Downloads我的电脑是Windows的,所以下载Wind...

【说站】C#在PDF中添加墨迹注释Ink Annotation的步骤详解

【说站】C#在PDF中添加墨迹注释Ink Annotation的步骤详解

PDF中的墨迹注释(Ink Annotation),表现为徒手涂鸦式的形状;该类型的注释,可任意指定形状顶点的位置及个数,通过指定的顶点,程序将连接各点绘制成平滑的曲线。下面,通过C#程序代码介绍如何...

【说站】使用systemctl配置dnspod-shell实现ddns

【说站】使用systemctl配置dnspod-shell实现ddns

这个是毛子路由器上用的脚本,由于碳云的nat服务器公网IP不断的变,因此只好通过ddns来稳定连接nat服务器了。顺便水一篇文章,大家新年快乐。使用前需要将域名添加到 DNSPod 中,并添加一条A记...

【说站】Python获取最新疫情数据实现动态地图实时展示各地情况

【说站】Python获取最新疫情数据实现动态地图实时展示各地情况

疫情降临转眼已经第三年了,时间过得真快,愿疫情早点结束,世界不再多灾多难。最近疫情稍微好转一些了,所以咱们获取一下最新的疫情数据,做个可视化地图看看。效果展示获取到的数据咱们保存到表格可视化地图颜色是...