MySQL InnoDB复合BTree索引是否索引NULL值及插入更新性能咨询
MySQL复合BTree索引对NULL值的处理及性能影响
1. MySQL是否会索引所有X、Y均为NULL的记录?
会的。MySQL的BTree索引会包含所有符合索引列定义的行,哪怕索引列全为NULL。不过有个关键细节:对于(X,Y)复合索引,所有X和Y都为NULL的行,会被视为一组相同的索引条目聚集存储。因为在MySQL的索引规则里,NULL与NULL被判定为相等,所以这类全NULL的行不会分散在索引树中,而是集中在同一个区域。
2. 插入/更新X、Y均为NULL的记录时,是否有小幅性能损耗?
是的,会存在轻微的性能损耗,但这个损耗通常可以忽略,除非你有极高频率的插入/更新操作(比如每秒数万次)。
原因很直接:每次插入或更新这类记录时,MySQL需要同步更新(X,Y)复合索引——找到索引中存储全NULL条目的固定区域,完成新索引条目的插入或现有条目的更新。不过因为所有全NULL的行都聚集在一起,这个操作的开销远低于处理非NULL值的索引更新(非NULL值需要遍历索引树定位到对应位置)。
另外结合你的场景来看,99.9%的行都是全NULL,这个索引的实际体积并不会太大——相同的全NULL索引条目在BTree中是紧凑存储的,不会每条都占用独立的大量空间,所以索引的磁盘占用也会比预期小很多。
内容的提问来源于stack exchange,提问作者giles3
相关产品推荐
相关产品推荐

