面试题答案
一键面试Compact格式下索引结构设计与优化
- 等值查询
- 单列索引:若查询条件为对单个列进行等值判断,如
SELECT * FROM table_name WHERE column_name = 'value';
,在该列上创建单列索引能大幅提升查询效率。InnoDB会利用B - Tree索引快速定位到对应记录。 - 复合索引:当等值查询涉及多个列,且这些列经常同时出现在查询条件中,如
SELECT * FROM table_name WHERE col1 = 'value1' AND col2 = 'value2';
,创建复合索引(col1, col2)
,索引顺序应与查询条件顺序尽量一致,InnoDB可通过索引快速定位满足所有条件的记录。
- 单列索引:若查询条件为对单个列进行等值判断,如
- 范围查询
- 单列索引:对于单列的范围查询,如
SELECT * FROM table_name WHERE column_name > 'value';
,在该列上创建单列索引即可。InnoDB通过B - Tree索引能够快速定位起始位置,并按顺序扫描符合范围条件的记录。 - 复合索引:若范围查询与等值查询混合,例如
SELECT * FROM table_name WHERE col1 = 'value1' AND col2 > 'value2';
,创建复合索引(col1, col2)
,先通过col1
的等值条件快速定位到一个较小范围,再在该范围内通过col2
的范围条件筛选记录。但要注意,复合索引中,只有最左前缀列能用于范围查询优化,如果查询是SELECT * FROM table_name WHERE col1 > 'value1' AND col2 = 'value2';
,仅col1
能利用索引的范围查找特性,col2
的索引作用不大。
- 单列索引:对于单列的范围查询,如
- 前缀索引
- 当列值较长,如长字符串列,为节省索引空间,可创建前缀索引。例如,对于一个很长的
text
类型列description
,若经常使用该列前几个字符进行查询,如SELECT * FROM table_name WHERE description LIKE 'prefix%';
,可创建前缀索引CREATE INDEX idx_description ON table_name(description(10));
,这里10表示取前10个字符作为索引,但要注意选择合适的前缀长度,既要保证索引空间节省,又要确保足够的区分度,避免过多的索引冲突。
- 当列值较长,如长字符串列,为节省索引空间,可创建前缀索引。例如,对于一个很长的
- 覆盖索引
- 若查询只需要索引列的值,而不需要回表操作获取整行记录,可创建覆盖索引。例如
SELECT col1, col2 FROM table_name WHERE col1 = 'value';
,创建复合索引(col1, col2)
,这样InnoDB可直接从索引中获取所需数据,无需再根据索引定位到数据行,减少I/O操作,提升查询性能。
- 若查询只需要索引列的值,而不需要回表操作获取整行记录,可创建覆盖索引。例如
其他行记录格式下索引设计与优化思路类似
- Redundant格式 虽然Redundant格式较旧,但索引设计原则与Compact类似。对于等值、范围等查询,同样要依据查询条件创建合适的单列或复合索引。不过由于Redundant格式在存储结构上的特点,可能索引占用空间相对较大,在创建索引时更要注意权衡空间与性能。
- Dynamic和Compressed格式 这两种格式在存储上对大字段有优化。索引设计方面,除遵循上述基本的等值、范围查询索引创建原则外,对于大字段相关的查询,若经常对大字段的部分内容进行查询(如大文本字段的前缀查询),可创建合适的前缀索引。并且由于它们在存储上的优势,可适当创建更多覆盖索引以提升查询性能,同时要关注索引维护成本,避免过多索引导致写入性能大幅下降。