面试题答案
一键面试查询重写
- 子查询优化:如果原始查询使用了多层子查询,可以尝试将其改写为连接查询。例如,若先在子查询中计算每个任务的时长,再统计平均时长,可将这些步骤整合到一个连接查询中。这样减少了查询的嵌套层次,数据库优化器能更好地处理查询计划。
- 避免使用临时表:在查询过程中,尽量避免产生临时表。若查询涉及复杂的分组和排序操作,数据库可能会自动创建临时表。通过调整查询逻辑,如合理使用窗口函数,可避免这种情况。例如,对于计算每个部门 - 项目组合的任务平均时长,使用窗口函数可以直接在结果集中计算,而不需要先分组到临时表再进行计算。
存储引擎选择
- InnoDB优势:对于这种多表关联且数据一致性要求高的场景,InnoDB通常是较好选择。它支持事务、行级锁,适合并发读写操作。在大型企业级数据库中,数据的完整性和并发控制至关重要,InnoDB的特性可以保证在高并发情况下数据的一致性。相比MyISAM,InnoDB在事务处理和并发控制方面更优,而MyISAM适合读多写少且对事务要求不高的场景。
- 特殊场景考量:若数据以只读为主,且对空间占用敏感,可以考虑Archive存储引擎。它以高效的压缩方式存储数据,但不支持索引,所以在查询有索引需求时不适用。不过如果查询条件简单且主要是全表扫描读取数据,Archive存储引擎可以在节省存储空间的同时提供较好的读取性能。
配置参数调整
- 缓冲池大小:InnoDB缓冲池用于缓存数据和索引。对于大型企业级数据库,适当增大缓冲池大小可以提高数据和索引的命中率,减少磁盘I/O。例如,根据服务器内存大小,将缓冲池设置为物理内存的60% - 80%。可以通过修改
my.cnf
文件中的innodb_buffer_pool_size
参数来调整。 - 线程相关参数:调整
innodb_thread_concurrency
参数,控制InnoDB存储引擎允许同时进入内核的线程数量。如果设置过小,可能会导致线程竞争不充分,影响并发性能;设置过大,可能会导致CPU上下文切换开销增大。一般根据服务器CPU核心数进行合理设置,如设置为CPU核心数的2倍。同时,max_connections
参数控制允许的最大连接数,要根据服务器性能和预估的并发连接数进行合理设置,避免过多连接耗尽系统资源。 - 查询缓存:MySQL的查询缓存可以缓存查询结果,如果相同查询再次执行,直接从缓存中返回结果。通过设置
query_cache_type
为1开启查询缓存,query_cache_size
设置缓存大小。但要注意,查询缓存对于数据变化频繁的场景可能效果不佳,因为每次数据修改都会使相关的查询缓存失效。
操作步骤
- 查询重写:
- 分析原始查询,确定是否存在多层子查询或可优化的分组排序逻辑。
- 根据优化思路,使用连接查询和窗口函数等方式重写查询。
- 在测试环境中运行重写后的查询,对比执行计划和执行时间,确保优化效果。
- 存储引擎选择:
- 评估业务场景对事务、并发、数据一致性以及空间占用等方面的需求。
- 如果当前不是InnoDB存储引擎,可通过
ALTER TABLE
语句将表的存储引擎转换为InnoDB。例如:ALTER TABLE employees ENGINE = InnoDB;
- 在转换后,进行性能测试,确保新的存储引擎满足业务性能需求。
- 配置参数调整:
- 修改
my.cnf
文件中的相关参数,如innodb_buffer_pool_size
、innodb_thread_concurrency
、max_connections
、query_cache_type
、query_cache_size
等。 - 修改完成后,重启MySQL服务使参数生效。
- 在测试环境中进行基准测试,观察性能指标变化,根据结果对参数进行微调,直到达到最佳性能。
- 修改