面试题答案
一键面试索引类型选择
- 普通索引:适用于单个列的查询条件。比如在某张表的
column1
列经常用于WHERE
子句中,可创建普通索引CREATE INDEX idx_column1 ON table_name(column1);
,提升单条件查询速度。 - 唯一索引:若某列数据具有唯一性,如用户表中的
email
列,可创建唯一索引CREATE UNIQUE INDEX idx_email ON user_table(email);
,既保证数据唯一性,又能加速查询。 - 主键索引:每张表建议设置主键,主键自动创建主键索引,用于唯一标识每一行数据,并且在关联查询和排序等操作中有很好的性能表现。
复合索引构建原则
- 最左前缀原则:复合索引如
CREATE INDEX idx_multiple ON table_name(column1, column2, column3);
,查询时如果WHERE
子句中条件顺序与索引列顺序一致,且从最左边开始连续使用索引列,索引才会生效。例如WHERE column1 = 'value1' AND column2 = 'value2'
能利用该索引,而WHERE column2 = 'value2'
则不能。 - 选择性高的列优先:将选择性(列中不同值的数量与总行数的比例)高的列放在复合索引前列。比如,性别列选择性低(一般只有男、女两种值),而订单编号选择性高,复合索引应优先放置订单编号列。
- 避免冗余索引:若已存在复合索引
idx_multiple
,不要再创建只包含其部分列的索引,如CREATE INDEX idx_column1 ON table_name(column1);
,因为前者已能满足包含column1
的查询,多余索引会增加维护成本。
可能遇到的性能瓶颈及解决方案
- 索引维护成本高:过多索引会增加插入、更新、删除操作的时间,因为每次数据变动都要更新索引。解决方案是定期评估索引使用情况,删除不再使用的索引,可通过
SHOW INDEX FROM table_name;
查看索引信息,结合查询日志分析索引是否被使用。 - 索引未命中:由于查询条件不符合索引使用规则导致索引未命中。通过
EXPLAIN
关键字分析查询语句,查看key
字段是否为预期索引,若不是,调整查询条件或索引结构,确保索引能被正确使用。 - 磁盘I/O瓶颈:大数据量下,即使有索引,磁盘I/O操作仍可能成为瓶颈。可通过增加内存(如调整
innodb_buffer_pool_size
参数),让更多数据能缓存到内存中,减少磁盘I/O;或者采用固态硬盘(SSD),提升磁盘读写性能。 - 查询优化器选择不佳:MySQL查询优化器可能选择非最优执行计划。此时可使用
FORCE INDEX
提示强制使用某个索引,如SELECT * FROM table_name FORCE INDEX (idx_multiple) WHERE column1 = 'value1';
,但使用时需谨慎,确保选择的索引确实是最优的。