MySQL中index_block_length定义及64位data_pointer长度咨询
关于MySQL查询性能估算公式的两个疑问解答
背景说明
MySQL官方文档《8.8.5 估算查询性能》给出磁盘寻道次数计算公式:
log(row_count) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1
文档附带示例计算:
在MySQL中,索引块通常为1,024字节,数据指针通常为4字节。对于500,000行、键值长度3字节(MEDIUMINT大小)的表,计算得log(500,000)/log(1024/3*2/(3+4)) + 1 = 4次寻道。
已知InnoDB基于B-Tree实现索引且理解公式逻辑,针对上述文档内容有以下两点疑问及解答:
疑问1:InnoDB是索引组织表,索引块应为默认16KB的innodb_page_size,为何文档称索引块通常为1024字节?
文档中这个描述是针对MyISAM引擎的历史遗留内容,并非指向InnoDB:
- 文档依据:该性能估算章节的公式最初为MyISAM设计,MyISAM的索引块(键缓存块)默认大小确实是1024字节,对应历史参数
key_buffer_block_size(该参数在新版本MySQL中已废弃,但早期文档有明确记录)。而InnoDB的核心存储单元是页,大小由innodb_page_size控制,默认16KB,这是索引组织表的基础特性。 - 源码依据:在MySQL 5.x及更早版本的源码中,MyISAM的
MI_KEY_CACHE结构体默认将索引块大小定义为1024字节;而InnoDB的buf_page_t相关代码中,页大小由innodb_page_size配置项决定,默认值为16384(即16KB)。
疑问2:64位版本MySQL中,data_pointer是否为8字节?
需分存储引擎说明:
MyISAM引擎
64位系统下,MyISAM的数据指针(指向数据文件的偏移量)确实是8字节:
- 文档依据:官方文档明确提到,MyISAM在64位系统中使用8字节指针,以支持超过4GB的大文件存储。
- 源码依据:MySQL源码的
myisam/mi.h头文件中,my_off_t类型在64位系统下被定义为long long(8字节),该类型即为MyISAM的数据指针类型。
InnoDB引擎
InnoDB的“数据指针”需区分场景:
- 二级索引中指向行的“指针”实际是聚簇索引的主键值,其长度由主键的字段类型决定,与系统位数无关。
- 若指B-Tree节点中的子页指针(页内偏移/页号指针),在64位系统下为8字节:
- 文档依据:官方文档说明,InnoDB二级索引存储主键值作为行定位标识,长度由主键定义决定;而B-Tree节点内的页指针在64位系统中采用8字节长度。
- 源码依据:InnoDB源码的
include/ut0types.h中,ulint类型在64位系统下为8字节,用于表示页内偏移和页指针;二级索引的行指针直接存储主键值,其长度由表的主键结构动态计算。
内容的提问来源于stack exchange,提问作者marvin263
相关产品推荐
相关产品推荐

