面试题答案
一键面试索引优化
- 分析查询语句:使用
EXPLAIN
关键字分析查询语句,查看查询执行计划,了解MySQL如何使用现有索引。例如:
EXPLAIN SELECT * FROM table1
JOIN table2 ON table1.id = table2.table1_id
WHERE table1.column1 = 'value' AND table2.column2 > 10;
- 为多表关联字段添加索引:如果关联字段没有索引,添加索引可以加快表连接速度。例如:
CREATE INDEX idx_table1_id ON table2(table1_id);
- 为WHERE条件字段添加索引:对于
WHERE
条件中的字段,如果没有索引,添加合适的索引。但要注意避免索引冗余。如:
CREATE INDEX idx_column1 ON table1(column1);
- 覆盖索引:如果查询中涉及的字段都包含在索引中,那么MySQL可以直接从索引中获取数据,避免回表操作。例如,如果查询为
SELECT column1, column2 FROM table1 WHERE column1 = 'value'
,可以创建复合索引:
CREATE INDEX idx_column1_column2 ON table1(column1, column2);
查询语句改写
- 子查询优化:如果查询中包含子查询,尝试将子查询改写为连接查询。例如,子查询:
SELECT column1 FROM table1
WHERE id IN (SELECT table1_id FROM table2 WHERE column2 = 'value');
可改写为连接查询:
SELECT table1.column1 FROM table1
JOIN table2 ON table1.id = table2.table1_id
WHERE table2.column2 = 'value';
- 减少SELECT * 使用:只选择需要的字段,避免返回不必要的数据,减少数据传输和处理开销。例如,将
SELECT * FROM table1
改为SELECT column1, column2 FROM table1
。 - 拆分复杂查询:如果查询过于复杂,可以考虑拆分成多个简单查询,减少单个查询的负载。
数据库配置优化
- 调整缓冲池大小:对于InnoDB存储引擎,增加
innodb_buffer_pool_size
参数值,可以将更多的数据和索引缓存到内存中,减少磁盘I/O。例如,在my.cnf
配置文件中:
[mysqld]
innodb_buffer_pool_size = 2G
- 优化线程参数:适当调整
thread_cache_size
,控制线程缓存数量,减少线程创建和销毁的开销。如:
[mysqld]
thread_cache_size = 64
- 查询缓存:虽然MySQL 8.0开始移除了查询缓存,但在之前版本中,可以合理配置
query_cache_type
和query_cache_size
来缓存查询结果,提高相同查询的响应速度。例如:
[mysqld]
query_cache_type = 1
query_cache_size = 64M
- 调整日志参数:适当调整
innodb_log_file_size
和innodb_log_files_in_group
等日志相关参数,优化InnoDB的日志写入性能。例如:
[mysqld]
innodb_log_file_size = 256M
innodb_log_files_in_group = 2