面试题答案
一键面试基本原理
- 数据结构方面
- 前缀压缩:MySQL 压缩索引通常会对索引中的值进行前缀压缩。以字符串类型的索引为例,很多字符串开头部分可能是相同的。比如在一个包含城市名称的索引中,“New York”“New Jersey”等,“New”部分是重复的。通过只存储重复前缀一次,并对后续不同部分进行编码,可以减少存储空间。
- 字典编码:对于重复出现的固定值集合,会构建一个字典。例如在性别字段(“男”“女”)的索引中,用数字(如 0 代表“男”,1 代表“女”)来替代实际的字符串值,从而减少存储字节数。在查询时,再通过字典将编码值转换回实际值。
- 存储方式方面
- 页级压缩:MySQL 数据存储以页为单位(通常 16KB)。压缩索引会在页内对索引记录进行压缩。在存储索引记录时,去除冗余信息,如固定长度字段中的填充字节等。同时,会对页内的空闲空间进行更有效的管理,使得页内可以存储更多的索引记录,减少页的使用数量,进而降低整体存储空间。
常见方式
- InnoDB 表的前缀索引压缩
- InnoDB 支持对 VARCHAR、BLOB 和 TEXT 类型字段的前缀索引压缩。用户可以在创建索引时指定前缀长度,例如
CREATE INDEX idx_name ON table_name (column_name(10));
,这里的 10 表示只对前 10 个字符进行索引。这样在存储索引时,只存储指定前缀长度的数据,减少了索引存储空间,同时在一定程度上也能满足查询需求,因为很多查询可以通过前缀匹配来完成。
- InnoDB 支持对 VARCHAR、BLOB 和 TEXT 类型字段的前缀索引压缩。用户可以在创建索引时指定前缀长度,例如
- MyISAM 表的键压缩
- MyISAM 支持键压缩,特别是对于字符串类型的索引。它会使用一种叫做“前缀压缩”的技术,对相邻键值的公共前缀进行压缩存储。例如,如果有多个索引值“abcdef”“abcghi”,MyISAM 会存储公共前缀“abc”一次,然后分别存储“def”和“ghi”,从而减少存储空间。在查询时,MyISAM 会快速解压前缀以进行键值匹配。