面试题答案
一键面试选择索引重建的情况及操作
- 情况:
- 当索引碎片严重,导致索引性能大幅下降时,比如在频繁进行大量数据的插入、删除操作后,索引页分裂过多,逻辑上连续的索引数据在物理存储上变得分散,查询性能显著降低。
- 索引结构损坏,例如在数据库发生崩溃、硬件故障等异常情况后,索引可能出现不一致或损坏,导致查询无法正确使用索引。
- 操作:
- MySQL 5.6 及以上:
- 对于 InnoDB 存储引擎,可以使用
ALTER TABLE table_name REBUILD INDEX index_name;
命令。原理是 InnoDB 会重新创建指定的索引,从表数据中重新构建索引结构,将数据按索引规则重新组织存储,消除碎片。例如,假设有表users
和索引idx_username
,则可以执行ALTER TABLE users REBUILD INDEX idx_username;
- 也可以使用
ALTER TABLE table_name ENGINE=InnoDB;
此命令会重建整个表,包括所有索引。它会先创建一个临时表,将原表数据按 InnoDB 存储格式重新插入到临时表,再删除原表并将临时表重命名为原表名,以此重建所有索引。例如ALTER TABLE users ENGINE=InnoDB;
- 对于 InnoDB 存储引擎,可以使用
- MySQL 5.5 及以下:
- 对于 MyISAM 存储引擎,可以使用
REPAIR TABLE table_name;
命令来重建索引。其原理是 MyISAM 存储引擎会扫描整个表的数据,重新生成索引文件,修复索引结构中的问题,减少碎片。例如REPAIR TABLE users;
- 对于 MyISAM 存储引擎,可以使用
- MySQL 5.6 及以上:
选择索引优化的情况及操作
- 情况:
- 当索引存在一些小问题,但未严重到需要重建时,例如在查询执行计划中发现索引使用效率不高,但索引结构基本正常。可能是由于索引设计不合理,如索引列选择不当、索引顺序不对等,或者查询语句本身没有充分利用好现有索引。
- 数据库负载较轻,且索引问题对性能影响较小时,通过优化可以在不影响业务过多的情况下逐步改善索引性能。
- 操作:
- 调整索引结构:
- 例如添加复合索引。如果经常有查询同时涉及多个列的过滤条件,如
SELECT * FROM orders WHERE customer_id = 1 AND order_date > '2023 - 01 - 01';
,可以考虑添加复合索引CREATE INDEX idx_customer_date ON orders (customer_id, order_date);
。原理是复合索引可以在一次索引查找中同时对多个列进行匹配,提高查询效率。 - 删除不必要的索引。如果有一些索引很少被使用,却在数据增删改时消耗额外的性能,可以使用
DROP INDEX index_name ON table_name;
命令删除。例如DROP INDEX idx_unused ON products;
,原理是减少数据库在维护索引上的开销,提高增删改操作的性能。
- 例如添加复合索引。如果经常有查询同时涉及多个列的过滤条件,如
- 优化查询语句:
- 使用
EXPLAIN
关键字分析查询语句,例如EXPLAIN SELECT * FROM products WHERE product_name LIKE 'abc%';
。EXPLAIN
会展示查询执行计划,包括使用的索引、表连接顺序等信息。根据分析结果,可以调整查询语句,使它更好地利用索引。如果发现索引未被使用,可以通过调整查询条件的顺序、避免使用函数操作索引列等方式来优化。例如将SELECT * FROM users WHERE UPPER(username) = 'ADMIN';
改为SELECT * FROM users WHERE username = 'admin';
以利用索引。
- 使用
- 调整索引结构: