本问题参考: https://www.zhihu.com/question/410506694/answer/1368215298 ,答案为个人原创
MySQL innoDB引擎索引基于 B+树,B+树有以下特点:
图片参考自:链接
然后,就需要提到一个概念,innodb_page_size
。InnoDB引擎读取数据,是一页一页读取的,这是InnoDB读取一页数据的大小。
innodb_page_size
是一个初始化数据库实例的参数,在目前的版本中(>=5.7.6),可以选择的值有4096, 8192, 16384, 32768, 65536。默认是16KB
一般越小,内存划分粒度越大,使用率越高,但是会有其他问题,就是限制了索引字段还有整行的大小。innodb引擎读取内存还有更新都是一页一页更新的,这个innodb_page_size
决定了,一个基本页的大小。常用B+Tree
索引,B+树是
为磁盘及其他存储辅助设备而设计一种平衡查找树(不是二叉树)。B+树
中,所有记录的节点按大小顺序存放在同一层的叶子节点中,各叶子节点用指针进行连接。MySQL将每个叶子节点的大小设置为一个页的整数倍,利用磁盘的预读机制,能有效减少磁盘I/O次数,提高查询效率。
对于主键索引,如果一个行数据,超过了一页的一半,那么一个页只能容纳一条记录,这样B+Tree
在不理想的情况下就变成了双向链表,B+树失去了意义。对于非主键索引,那么索引列数据+主键指针数据超过一页的一半,也是同理。
最后,说一下索引字段大小限制:
索引字段大小限制
innodb_large_prefix
这个配置的限制: