面试题答案
一键面试存储引擎方面
- 检查存储引擎设置:确认当前使用的存储引擎是否适合业务场景。例如,InnoDB适用于大多数有事务需求的场景,而MyISAM在某些读密集且无事务要求场景可能有优势。查看
SHOW CREATE TABLE
语句确认存储引擎类型。 - 查看存储引擎状态:对于InnoDB,可以通过
SHOW ENGINE INNODB STATUS
获取详细状态信息,检查是否存在锁争用(如InnoDB row lock waits
)、缓冲池命中率(Buffer pool hit rate
)等问题。
查询优化方面
- 分析慢查询日志:开启慢查询日志(修改
my.cnf
配置文件中的slow_query_log
参数),查看长时间运行的查询。使用EXPLAIN
关键字分析这些查询,检查索引使用情况(key
字段)、表连接类型(type
字段)等。 - 优化查询语句:
- 确保查询中条件字段上有合适的索引。若缺少索引,可使用
CREATE INDEX
添加。 - 避免在索引列上使用函数,这可能导致索引失效。例如
WHERE DATE(column_name) = '2023 - 01 - 01'
应改为WHERE column_name >= '2023 - 01 - 01' AND column_name < '2023 - 01 - 02'
。 - 优化子查询,可将一些子查询改写为连接查询,提高查询效率。
- 确保查询中条件字段上有合适的索引。若缺少索引,可使用
- 检查查询缓存:查看查询缓存配置及使用情况,通过
SHOW STATUS LIKE 'Qcache%'
查看相关状态变量。若查询缓存命中率低,考虑调整查询缓存参数或禁用查询缓存(MySQL 8.0 已移除查询缓存)。
分区策略方面
- 查看分区策略:使用
SHOW CREATE TABLE
语句确认当前分区策略(如RANGE
、LIST
、HASH
等)是否合适业务需求。例如,按时间范围查询频繁的业务,RANGE
分区按时间分区较为合适。 - 检查分区数据分布:查看各分区的数据量是否均匀。可通过
SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_schema = 'your_database' AND table_name = 'your_table'
查看每个分区的行数。若数据分布不均,可能导致部分分区负载过高,可考虑调整分区策略或进行数据迁移。 - 分区维护:检查是否有过期或不需要的分区。对于
RANGE
分区按时间分区的场景,可定期删除过期分区,使用ALTER TABLE your_table DROP PARTITION partition_name
语句,以减少不必要的存储和查询开销。