面试题答案
一键面试- 分析现有索引问题的思路
- 查看查询语句:
- 从基准测试结果中提取性能较差的查询语句。分析查询语句中涉及的表、列以及使用的条件。例如,对于
SELECT * FROM users WHERE age > 30 AND city = 'New York';
这样的查询,要关注age
和city
列。
- 从基准测试结果中提取性能较差的查询语句。分析查询语句中涉及的表、列以及使用的条件。例如,对于
- 检查索引使用情况:
- 使用
EXPLAIN
关键字分析查询语句。EXPLAIN
会显示查询优化器如何执行查询,包括是否使用了索引、使用的是哪个索引等信息。例如,执行EXPLAIN SELECT * FROM users WHERE age > 30 AND city = 'New York';
,如果key
字段显示为NULL
,说明没有使用索引。 - 查看慢查询日志(如果开启),日志中会记录执行时间较长的查询以及相关索引使用情况等信息。
- 使用
- 分析索引覆盖情况:
- 判断索引是否覆盖查询所需的所有列。如果查询语句为
SELECT age, city FROM users WHERE age > 30 AND city = 'New York';
,若现有索引只包含age
列,而没有city
列,可能导致回表操作,影响性能。回表是指通过索引找到主键,再根据主键去聚簇索引中获取其他列的数据。
- 判断索引是否覆盖查询所需的所有列。如果查询语句为
- 评估索引选择性:
- 索引选择性是指索引中不同值的数量与表中记录数量的比例。选择性越高,索引的效率越高。可以通过
SELECT COUNT(DISTINCT column_name) / COUNT(*) FROM table_name;
来计算某列索引的选择性。例如,对于性别列,选择性可能较低,因为只有两种取值,这种列单独建立索引可能效果不佳。
- 索引选择性是指索引中不同值的数量与表中记录数量的比例。选择性越高,索引的效率越高。可以通过
- 查看查询语句:
- 迭代优化索引结构的操作步骤
- 添加缺失索引:
- 根据分析结果,如果查询中某个条件列没有索引,添加合适的索引。例如,对于上述
users
表的查询,如果age
和city
列都没有索引,可以添加联合索引CREATE INDEX idx_age_city ON users(age, city);
。一般来说,将选择性高的列放在联合索引的前面。
- 根据分析结果,如果查询中某个条件列没有索引,添加合适的索引。例如,对于上述
- 调整索引顺序:
- 如果联合索引的列顺序不合理,可能影响查询性能。例如,对于
SELECT * FROM users WHERE city = 'New York' AND age > 30;
,如果已有联合索引idx_age_city
,可以考虑调整为CREATE INDEX idx_city_age ON users(city, age);
,因为city
列在查询条件中是等值查询,放在前面可能更有利于索引的使用。
- 如果联合索引的列顺序不合理,可能影响查询性能。例如,对于
- 删除冗余和低效索引:
- 冗余索引是指两个或多个索引包含相同的列组合,只是列顺序不同或者其中一个索引是另一个索引的前缀。例如,已有索引
idx_age_city
,又有索引idx_age
,idx_age
可能就是冗余索引,可以删除。 - 低效索引是指选择性很低或者很少被使用的索引。通过分析查询日志和索引使用情况,找出这些索引并删除。例如,某个索引对应的列只有很少的几个不同值,且在查询中很少被用到,就可以考虑删除。
- 冗余索引是指两个或多个索引包含相同的列组合,只是列顺序不同或者其中一个索引是另一个索引的前缀。例如,已有索引
- 重新评估和测试:
- 在进行索引优化操作后,再次使用基准测试工具对数据库进行测试。确保性能得到提升,同时检查是否引入了新的问题,如插入、更新操作性能下降等。因为索引在提升查询性能的同时,可能会影响写操作的性能,需要平衡。如果出现新问题,重复上述分析和优化步骤,直到达到满意的性能。
- 添加缺失索引: