哈希索引原理,关系型数据库工作原理

关系型数据库工作原理-查询优化器之索引(翻译自Coding-Geek文章),

本文翻译自Coding-Geek文章:《 How does a relational database
work》。原文链接:

本文翻译了如下章节, 介绍数据库的查询优化器索引:

永利皇宫登录网址 1

SQL Server2014 哈希索引原理

翻译自

跟哈希 join,哈希 聚合的原理一样,了解哈希索引的原理也会同时明白哈希
join和哈希 聚合的原理

 

SQL Server 2014推出的的新索引类型叫做 hash index。介绍hash
index之前一定要介绍哈希函数这样会让大家更明白哈希索引的原理

当一个key-value键值对传递给一个哈希函数的时候,经过哈希函数的计算之后,根据结果会把key-value键值对放在合适的hash
buckets(哈希存储桶)里

 

举个栗子

我们假设对10取模( % 10 )就是哈希函数。如果key-value键值对的key是1525
,传递到哈希函数,那么1525 会存放在第五个bucket里

因为5 as 1525 % 10 = 5。

同样,537 会存放在第七个bucket ,2982 会存放在第二个bucket ,依次类推

 

同样,在hash
index里面,哈希索引列会被传递给哈希函数做匹配(类似于java里面的HashMap的Map操作),匹配成功之后,

索引列会被存储在匹配到的hash
bucket里面的表里,这个表里会有实际的数据行指针,再根据实际的数据行指针查找对应的数据行。

 

概括来说,要查找一行数据或者处理一个where子句,SQL
Server引擎需要做下面几件事

1、根据where条件里面的参数生成合适的哈希函数

2、索引列进行匹配,匹配到对应hash bucket,找到对应hash
bucket意味着也找到了对应的数据行指针(row pointer)

3、读取数据

 

哈希索引比起B树索引简单,因为它不需要遍历B树,所以访问速度会更快

永利皇宫登录网址 2

 

永利皇宫登录网址 ,哈希函数和相应语法的例子

CREATE TABLE dbo.HK_tbl
    (
      [ID] INT IDENTITY(1, 1)
               NOT NULL
               PRIMARY KEY NONCLUSTERED HASH WITH ( BUCKET_COUNT = 100000 ) ,
      [Data] char(32) COLLATE Latin1_General_100_BIN2
                      NULL ,
      [dt] datetime NOT NULL,
    )
    WITH (
         MEMORY_OPTIMIZED =
         ON,
         DURABILITY =
         SCHEMA_AND_DATA);

 

在SQL Server
2014里面,内存优化表创建完之后就不能再加哈希索引了,但是在 SQL Server
2016 里支持表创建完之后添加哈希索引,不过

添加哈希索引是一个离线操作。

 

 

哈希索引的Bucket 数量

( BUCKET_COUNT = 100000 )定义了哈希索引能够使用的BUCKET数量,这个Bucket
是固定的并且由用户指定Bucket 数量,

而不是执行查询的时候由SQL Server决定生成的Bucket
数量。BUCKET数量总是2的次方的四舍五入( 1024, 2048, 4096 etc..)

BUCKET_COUNT 的数量一定要设置合适,否则哈希冲突太多,反而性能会下降

 

 

SQL
Server2014的哈希索引其实跟MySQL的自适应哈希索引原理其实差不多,都是为了摆脱B树的束缚,使查找效率更快

How does a relational database work这篇文章也有描述hash
join的原理,大家可以看一下

永利皇宫登录网址 3

永利皇宫登录网址 4

 

 

相关文章

MySQL Adaptive hash index

java HashMap那点事

How does a relational database
work

 

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

网站地图xml地图