MST
星途 面试题库

面试题:MySQL中压缩索引是如何实现的

请阐述MySQL压缩索引实现的基本原理与常见方式,例如从数据结构、存储方式等方面说明。
26.7万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

基本原理

  1. 数据结构方面
    • 前缀压缩:MySQL 压缩索引通常会对索引中的值进行前缀压缩。以字符串类型的索引为例,很多字符串开头部分可能是相同的。比如在一个包含城市名称的索引中,“New York”“New Jersey”等,“New”部分是重复的。通过只存储重复前缀一次,并对后续不同部分进行编码,可以减少存储空间。
    • 字典编码:对于重复出现的固定值集合,会构建一个字典。例如在性别字段(“男”“女”)的索引中,用数字(如 0 代表“男”,1 代表“女”)来替代实际的字符串值,从而减少存储字节数。在查询时,再通过字典将编码值转换回实际值。
  2. 存储方式方面
    • 页级压缩:MySQL 数据存储以页为单位(通常 16KB)。压缩索引会在页内对索引记录进行压缩。在存储索引记录时,去除冗余信息,如固定长度字段中的填充字节等。同时,会对页内的空闲空间进行更有效的管理,使得页内可以存储更多的索引记录,减少页的使用数量,进而降低整体存储空间。

常见方式

  1. InnoDB 表的前缀索引压缩
    • InnoDB 支持对 VARCHAR、BLOB 和 TEXT 类型字段的前缀索引压缩。用户可以在创建索引时指定前缀长度,例如 CREATE INDEX idx_name ON table_name (column_name(10));,这里的 10 表示只对前 10 个字符进行索引。这样在存储索引时,只存储指定前缀长度的数据,减少了索引存储空间,同时在一定程度上也能满足查询需求,因为很多查询可以通过前缀匹配来完成。
  2. MyISAM 表的键压缩
    • MyISAM 支持键压缩,特别是对于字符串类型的索引。它会使用一种叫做“前缀压缩”的技术,对相邻键值的公共前缀进行压缩存储。例如,如果有多个索引值“abcdef”“abcghi”,MyISAM 会存储公共前缀“abc”一次,然后分别存储“def”和“ghi”,从而减少存储空间。在查询时,MyISAM 会快速解压前缀以进行键值匹配。