
当前系统因高并发更新(锁竞争导致并发低)和频繁查询(全表扫描I/O瓶颈),需通过索引优化(覆盖索引)、读写分离(主从复制+路由)、缓存(Redis热点数据)解决,预期提升并发能力,查询延迟降低20%-30%。
老师口吻解释:关系型数据库在高并发场景下,更新操作会竞争行级锁(如MySQL的行锁),导致并发度低;查询时若表无索引,全表扫描导致I/O开销大。
| 优化策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 索引优化 | 为表字段创建B+树索引,加速数据检索 | 提升查询效率,增加写开销(索引维护) | 查询频繁、数据量大的表(如按专业、年级查询就业状态) | 选择覆盖索引(包含所有查询和排序字段),避免冗余索引 |
| 读写分离 | 主库写,从库读,主从复制实现 | 分担读压力,提升并发;从库数据延迟 | 高并发读场景(如查询就业状态、统计各专业就业率) | 配置延迟阈值(如≤1秒),读请求优先从低延迟从库获取;写操作只写主库 |
| 缓存策略 | 将热点数据存入Redis,减少数据库访问 | 响应快,降低数据库压力;需处理失效 | 热点数据(如热门专业就业人数、各年级就业率) | TTL(如1小时)+主动失效(更新时清除缓存),结合布隆过滤器减少缓存穿透 |
假设学生就业信息表(student_job)字段:id(主键,INT,自增)、student_id(INT,外键)、major(VARCHAR,专业)、grade(VARCHAR,年级)、employment_status(VARCHAR)。
SELECT * FROM student_job WHERE major='计算机' AND grade='2023' ORDER BY id DESC;idx_major_grade_id (major, grade, id),包含查询和排序字段,减少回表。SQL:CREATE INDEX idx_major_grade_id ON student_job (major, grade, id);job_stats:computer:2023,值就业人数(INT),TTL 3600秒。更新就业状态时,执行DEL job_stats:computer:2023清除缓存。面试官您好,针对现有学生信息管理系统,当前因就业数据每日数百条更新和频繁查询(如按专业、年级查就业状态),导致性能瓶颈。核心问题是更新时锁竞争导致并发低,查询时全表扫描I/O高。优化方案:一是为查询字段(专业、年级)创建复合覆盖索引(如idx_major_grade_id (major, grade, id)),避免回表,提升查询效率;二是采用读写分离,主库写,从库读,用ProxySQL管理路由,分担读压力;三是用Redis缓存热点数据(如热门专业就业统计),结合1小时TTL和主动失效(更新时清除缓存),减少数据库访问。预期效果是查询延迟降低20%-30%,更新并发提升20%,系统整体响应更快。
EXPLAIN分析查询计划,若查询字段都在索引列中(无回表),则为覆盖索引。例如,EXPLAIN SELECT * FROM student_job WHERE major='计算机' AND grade='2023' ORDER BY id DESC;中,若Key列显示为idx_major_grade_id,且Rows为小值,说明是覆盖索引。DEL命令,避免脏数据。READ COMMITTED隔离级别,可能导致幻读,加剧锁竞争;可升级为REPEATABLE READ,减少锁持有时间,缓解竞争。SHOW INDEX STATUS),删除冗余索引。READ COMMITTED升级为REPEATABLE READ)。