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
不同于前文所讲的哈希表,自适应哈希索引是数据库自身创建并使用的,DBA不能对其进行干预。自适应哈希索引经哈希函数映射到一个哈希表中,因此对于字典类型的查找非常快速,但对于范围查找无能为力!
可以通过参数 innodb_adaptive_hash_index 来禁用或者开启