面试题答案
一键面试索引维护
- 合理设计索引:
- 避免冗余索引:仔细检查并删除重复或不必要的索引,减少索引维护开销。例如,如果已有
(col1, col2)
联合索引,单独的col1
索引可能是冗余的(在某些查询模式下)。 - 覆盖索引:设计能够覆盖查询的索引,减少回表操作。比如查询
SELECT col1, col2 FROM table WHERE col3 = 'value'
,可创建(col3, col1, col2)
索引,使查询直接从索引获取数据,无需再到数据页查找。
- 避免冗余索引:仔细检查并删除重复或不必要的索引,减少索引维护开销。例如,如果已有
- 定期重建和优化索引:
- 重建索引:随着数据的增删改,索引可能出现碎片化,定期重建索引可优化其物理存储结构。在MySQL中,可使用
ALTER TABLE table_name REBUILD INDEX index_name;
语句。 - 优化索引:利用
ANALYZE TABLE
语句更新索引统计信息,使查询优化器能生成更优的执行计划。ANALYZE TABLE table_name;
- 重建索引:随着数据的增删改,索引可能出现碎片化,定期重建索引可优化其物理存储结构。在MySQL中,可使用
- 调整索引粒度:
- 分区索引:对大表采用分区技术,每个分区有独立的索引。如按时间分区,不同时间段的数据及其索引在物理上分离,减少锁争用范围。在MySQL中创建分区表并指定分区索引策略。
- 前缀索引:对于长字符串列,使用前缀索引可减少索引大小,降低维护成本。例如
CREATE INDEX idx_name ON table_name (long_string_col(10));
表示使用前10个字符创建索引。
索引监控
- 使用SHOW STATUS:
SHOW STATUS LIKE 'Handler_read%';
查看索引读相关状态,如Handler_read_rnd_next
值过高可能表示索引使用不合理,全表扫描过多。SHOW STATUS LIKE 'Innodb_row_lock%';
了解行锁争用情况,Innodb_row_lock_waits
表示等待锁的次数,Innodb_row_lock_time
表示等待锁的总时间。
- 慢查询日志:
- 开启慢查询日志
slow_query_log = 1
,并设置long_query_time
阈值(如long_query_time = 2
表示查询执行时间超过2秒记录到日志)。分析慢查询日志,可发现索引使用不当的查询,通过EXPLAIN
关键字进一步分析查询计划,优化索引。
- 开启慢查询日志
- 性能模式:
- MySQL性能模式(Performance Schema)可深入监控索引使用情况。启用性能模式后,可通过
performance_schema.events_statements_summary_by_digest
表查看不同查询的执行统计信息,包括索引使用次数等。
- MySQL性能模式(Performance Schema)可深入监控索引使用情况。启用性能模式后,可通过
- 工具:
- pt - query - digest:用于分析MySQL慢查询日志,能直观展示查询执行频率、平均执行时间、索引使用情况等,帮助发现性能瓶颈和索引问题。
- MySQL Enterprise Monitor:官方监控工具,提供全面的数据库性能监控,包括索引健康状况、锁争用等详细信息,有图形化界面便于查看和分析。
通过上述索引维护和监控手段,可在高并发读写的MySQL环境中保障数据库的高可用性和高性能。