首页 > 数据库 >MySQL 哈希索引、空间数据索引、全文索引

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

时间:2023-01-25 20:03:18浏览次数:44  
标签:customer 存储 name 全文索引 查询 空间数据 索引 哈希


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.小结

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

标签:customer,存储,name,全文索引,查询,空间数据,索引,哈希
From: https://blog.51cto.com/10zhancom/6022775

相关文章

  • 如何高效高性能的选择使用 MySQL 索引?
    想要实现高性能的查询,正确的使用索引是基础。本小节通过多个实际应用场景,帮助大家理解如何高效地选择和使用索引。1.独立的列独立的列,是指索引列不能是表达式的一部分,也不......
  • MySQL索引使用注意事项
    数据库索引可以提高搜索效率,在创建数据库的时候,就要考虑到,针对哪个业务字段添加什么样的索引,可以提高数据的查询效率。所以,索引在数据库是有很重要的位置的。今天就来学习一......
  • 【Linux】Ubuntu镜像索引
    ✨Ubuntu镜像索引Ubuntu官方网站似乎UbuntuARM镜像并不容易寻找可以点击如下链接前往Ubuntu镜像索引选择需要版本http://cdimage.ubuntu.com/可以非常方便地下载到Des......
  • 【Linux】Kali Linux镜像索引
    ✨KaliLinux镜像索引通过分析KaliLinux下载链接不难发现如下镜像索引链接较新版本镜像:https://kali.download/base-images/较新版本虚拟机镜像:https://kali.downlo......
  • nginx索引静态文件
    前言针对nas服务器文件下载或者需要索引一些静态二进制文件的地方,可以利用nginx自带的索引文件功能实现。root/var/www/html;#索引目录autoindexon;autoindex_exact_......
  • nginx索引静态文件
    前言针对nas服务器文件下载或者需要索引一些静态二进制文件的地方,可以利用nginx自带的索引文件功能实现。root/var/www/html;#索引目录autoindexon;autoindex_exact......
  • 面试题-索引设计的原则
    索引设计的原则针对于数据量较大,且查询比较频繁的表建立索引。针对于常作为查询条件(where)、排序(orderby)、分组(groupby)操作的字段建立索引。尽量选择区分度高......
  • 03对数组使用索引查询
    importnumpyasnp#基础索引x1=np.arange(10)x2=np.arange(20).reshape(4,5)print(x1)print('-----')print(x1[0],x1[9],x1[-1])print('-----')print(x1[2:......
  • numpy广播机制与高级索引使用
    numpy广播机制与高级索引使用NumPy比一般的Python序列提供更多的索引方式。除了整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引。类型转换import......
  • 面试题-什么是最左前缀法则?什么时候索引将失效?
    什么是最左前缀法则?什么时候索引将失效?如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索......