✅从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?

典型回答

InnoDB的索引通常使用的是B+树的数据结构。B+树的结构特性和磁盘I/O操作的特性就决定了索引的key如果太长会影响性能。

✅介绍一下InnoDB的数据页,和B+树的关系是什么?

在上面的文章汇中,介绍过,InnoDB的数据页是InnoDB存储引擎中用于存储数据的基本单位。B+树的每个节点都对应着一个数据页,包括根节点、非叶子节点和叶子节点。一个数据页的大小是固定的,通常为16KB。

数据页是磁盘上的一个连续区域,通常大小为16KB当然,也可以通过配置进行调整。16KB就意味着Innodb的每次读写都是以 16KB 为单位的,一次从磁盘到内存的读取的最小是16KB,一次从内存到磁盘的持久化也是最小16KB。

首先,B+树是一种平衡多路查找树,其性能部分依赖于树的深度。key长度增加会导致每个数据页能存储的键值对数量减少(因为页大小固定,key长度更大,能存的数量就更少),这可能导致B+树的深度增加。 树的深度增加意味着查询、插入或删除操作需要更多的磁盘I/O操作来遍历这些额外的层级,从而降低性能。

其次,磁盘I/O操作是数据库操作中成本最高的部分之一。因为每个B+树节点通常对应于磁盘上的一个页,其大小在InnoDB中默认为16KB。如果索引的key长度很长,每个页面能存放的节点数就会减少,这意味着处理查询时需要读取更多的页面,从而增加了磁盘I/O操作的次数,降低了查询效率。

还有就是,在B+树中进行键值查找时,如果key长度过长,比较操作的成本会增加,尤其是对于字符串这类可变长度的数据类型。这会导致每一次查找操作都消耗更多的CPU资源,进一步影响到查询性能。

所以,索引的 key 长度不建议太长。但是也不要太短,太短可能会导致区分度不够高,比如身份证号,如果你只用前6位当做索引的话,因为重复度很高,那么索引效果就会很差。所以需要在区分度和长度时间做一个平衡。

原文: https://www.yuque.com/hollis666/xkm7k3/rs2pun6gm1yblwmn