【jvm我能讲两小时017】Mysql是如何获取索引所在内存中数据页的?
2023-09-27 14:29:25 时间
Mysql是如何获取索引所在内存中数据页的?
哈希表, 利用哈希算法。
哈希算法是一种常见算法, 时间复杂度为O (1) , 且不只存在于索引中, 每个数据库应用中都存在该数 据库结构。
数据库中一般采用除法散列的方法, 发生碰撞时采用链地址法。
在哈希函数的除法散列法中, 通过取k除以m的余数, 将关键字k映射到m个槽的某一个去, 即哈希函数为:
h(k)=k mod m
InnoDB存储引擎使用哈希算法来对字典进行查找, 其冲突机制采用链表方式, 哈希函数采用除法散列方 式 。对于缓冲池页的哈希表来说, 在缓冲池中的Page页都有一个chain指针, 它指向相同哈希函数值的页。 而对于除法散列, m的取值为略大于2倍的缓冲池页数量的质数 。例如: 当前参数innodb_buffer_pool_size 的大小为10M, 则共有640个16KB的页 。对于缓冲池页内存的哈希表来说, 需要分配640×2=1280个槽 , 但是由于1280不是质数, 需要取比1280略大的一个质数, 应该是1399, 所以在启动时会分配1399个槽的 哈希表, 用来哈希查询所在缓冲池中的页。
InnoDB存储引擎的表空间都有一个space_id, 用户所要查询的应该是某个表空间的某个连续16KB的页, 即 偏移量offset 。 InnoDB存储引擎将space_id左移20位, 然后加上这个space_id和offset, 即关键字 K=space_id<<20+space_id+offset, 然后通过除法散列到各个槽中去。
相关文章
- MySQL索引最左匹配原则及优化原理
- 华为云GaussDB(for MySQL)2.0全新升级,三大技术大揭秘
- php用PDO查询mysql数据库结果中文乱码
- MySQL获取所有分类的前N条记录
- MySQL 跨库分页/ 分表分页/ 跨库分页,为什么这么难?
- 自动化测试之获取mysql中的数据
- 三种记录 MySQL 所执行过的 SQL 语句的方法
- PHP和MYSQL的编码问题
- vc6.0连接mysql数据库
- 2022-10-30 mysql-CREATE PROCEDURE and CREATE FUNCTION Statements
- MySql主从同步介绍
- nodejs连接mysql报connect ECONNREFUSED错误的解决方法
- 数据存储---Mysql双机互为热备方案实践
- mysql 5.7*8.0/percona server/mariadb 10.x安装与服务器参数优化
- MySQL组复制MGR(一)-- 技术概述
- MYSQL错误解决:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- 【mysql我能讲两小时029】如何预防数据库死锁?生产环境如何避免死锁?