面试题答案
一键面试索引设计
- 复合索引:
- 对于按
operation_type
分组后分别按operation_time
排序的需求,创建复合索引(operation_type, operation_time)
。这样在查询时,MySQL 可以利用这个索引快速定位到不同operation_type
下按operation_time
排序的数据。因为复合索引遵循最左前缀原则,operation_type
在前可满足分组需求,operation_time
在后可满足排序需求。 - 如果查询还涉及到
user_id
,可以根据具体查询频率和组合,考虑添加user_id
到复合索引中,如(operation_type, user_id, operation_time)
或(user_id, operation_type, operation_time)
,以覆盖更多查询场景。
- 对于按
- 覆盖索引:
- 对于经常查询的字段,如果这些字段包含在索引中,就可以避免回表操作,提高查询性能。例如,如果查询经常返回
log_id
、operation_type
和operation_time
,可以创建覆盖索引(operation_type, operation_time, log_id)
。
- 对于经常查询的字段,如果这些字段包含在索引中,就可以避免回表操作,提高查询性能。例如,如果查询经常返回
索引维护策略
- 定期重建索引:
- 随着数据的不断插入、更新和删除,索引会产生碎片,影响查询性能。可以定期(例如每周或每月)对索引进行重建。在MySQL中,可以使用
ALTER TABLE logs DROP INDEX index_name;
先删除索引,然后再使用CREATE INDEX
重新创建索引来重建索引。 - 选择业务低峰期进行索引重建,以减少对正常业务的影响。
- 随着数据的不断插入、更新和删除,索引会产生碎片,影响查询性能。可以定期(例如每周或每月)对索引进行重建。在MySQL中,可以使用
- 优化索引:
- 定期分析索引的使用情况,使用
SHOW INDEX FROM logs;
查看索引的详细信息,包括索引的基数(cardinality)。基数低的索引可能对性能提升不大,可以考虑删除。 - 对于复合索引,如果某些前缀部分在查询中很少单独使用,可以考虑重新调整复合索引的顺序,以更好地满足最频繁的查询需求。
- 定期分析索引的使用情况,使用
使用MySQL性能分析工具验证和调整
- EXPLAIN:
- 在执行复杂排序查询前,使用
EXPLAIN
关键字分析查询计划。例如:EXPLAIN SELECT operation_type, operation_time FROM logs GROUP BY operation_type ORDER BY operation_time;
- 查看
EXPLAIN
结果中的key
字段,确认是否使用了预期的索引。如果key
为NULL
,说明未使用索引,需要检查索引设计是否合理。 - 关注
type
字段,理想情况下应该是range
、ref
等高效的访问类型,如果是ALL
,表示全表扫描,性能较差,需要优化索引。 - 根据
EXPLAIN
结果中的rows
字段预估查询扫描的行数,行数越少性能越好。如果行数过多,可能需要进一步优化索引或查询条件。
- 在执行复杂排序查询前,使用
- 慢查询日志:
- 开启MySQL的慢查询日志,通过
long_query_time
参数设置慢查询的时间阈值(例如设置为2秒)。所有执行时间超过这个阈值的查询都会被记录到慢查询日志中。 - 分析慢查询日志,找出那些涉及日志表排序查询的慢查询语句。对于这些慢查询,结合
EXPLAIN
分析结果进行优化,如调整索引、优化查询语句等。
- 开启MySQL的慢查询日志,通过