InnoDB存储引擎中的自适应哈希索引

InnoDB存储引擎使用哈希算法来对字典进行查找,其冲突机制采用链表方式,哈希函数采用除法散列方式

对于缓冲池页的哈希表来说,缓冲池的Page页都有一个chain指针,指向相同哈希值的页。

对于除法散列,模m的值略大于2倍的缓冲池的总页数的质数。

如: innodb_buffer_pool_size = 10M ,则共有页数为 10*1024*1024/(16*1024) = 640个页。

缓冲池页内存的哈希表来说,需要分配640*2个槽,比1280大的最小质数为1399,启动时会分配1399个槽的哈希表,用来哈希查询所在缓冲池中的页。

如何查询缓冲池中的哈希表页?

InnoDB存储引擎中的表空间都有一个space_id,实际用户查询的是一个page大小内容,即偏移量offset。InnoDB存储引擎将space_id 左移20位,然后加上这个space_id 和 offset,即 K = space_id<<20 + space_id + offset, 然后 K/m 散列到各个槽去。

 

InnoDB中的自适应哈希索引 SHOW ENGINE INNODB STATUS

InnoDB存储引擎中的自适应哈希索引

不同于前文所讲的哈希表,自适应哈希索引是数据库吱声创建并使用的,DBA不能对其进行干预。自适应哈希索引经哈希函数映射到一个哈希表中,因此对于字典类型的查找非常快速,但对于范围查找无能为力!

可以通过参数 innodb_adaptive_hash_index 来禁用或者开启