Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试官:工作中优化MySQL的手段有哪些?

面试官:工作中优化MySQL的手段有哪些?

作者头像
磊哥
发布于 2025-03-26 06:22:51
发布于 2025-03-26 06:22:51
14400
代码可运行
举报
文章被收录于专栏:王磊的博客王磊的博客
运行总次数:0
代码可运行

MySQL 是面试中必问的模块,而 MySQL 中的优化内容又是常见的面试题,所以本文来看“工作中优化MySQL的手段有哪些?”。

工作中常见的 MySQL 优化手段分为以下五大类:

  1. 索引优化:确保高频查询字段有合适索引。
  2. SQL优化:减少全表扫描、避免不必要计算。
  3. 事务与锁优化:避免长事务、使用批量插入。
  4. 架构优化:数据量大时进行读写分离或分库分表。
  5. 硬件和配置优化:升级硬件和 MySQL 参数调优。

1.索引优化

索引优化包含以下内容:

  1. 高频字段需要创建索引:对于读多少写的场景,一定要创建正确的索引,避免全表扫描,提升查询效率。
  2. 避免索引失效:在有索引的前提下,确保索引不会失效,因此需要避免一些导致索引失效的场景,例如以下这些:
    1. 联合索引未遵循最左匹配原则。
    2. 使用列运行或内置函数导致索引失效。
    3. like 查询未非前缀模糊查询。
    4. 隐私类型转换等。
  3. 避免回表查询:如果查询只需要索引字段,避免回表,例如以下示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 原始查询(需回表)
SELECT * FROM orders WHERE user_id = 100;
-- 优化为覆盖索引
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
SELECT user_id, status FROM orders WHERE user_id = 100;

2.SQL优化

2.1 避免 SELECT *

只查询需要的字段,减少数据传输和内存占用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 不推荐
SELECT * FROM products;
-- 推荐
SELECT id, name, price FROM products;
2.2 分页优化

大数据量分页时,避免 LIMIT 100000, 10,而是使用上次查询 ID 作为起始 ID 进行查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 原始分页(性能差)
SELECT * FROM logs ORDER BY id LIMIT 100000, 10;
-- 优化:使用游标分页(记录上一页最后一条的 id)
SELECT * FROM logs WHERE id>100000 ORDER BY id LIMIT 10;
2.3 JOIN 优化
  • 确保关联字段有索引,使用小表驱动大表。

【图片来源于网络,侵权可删】

例如以下示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 小表(emp)驱动大表(dept)
SELECT * FROM emp 
INNER JOIN dept ON emp.dept_id = dept.id;

3. 事务和锁优化

3.1 减少长事务

长事务会导致锁竞争和回滚段膨胀:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 不推荐:事务中包含耗时操作
BEGIN;
UPDATE account SET balance = balance - 100 WHERE id = 1;
-- 执行其他耗时操作...
COMMIT;
-- 推荐:尽快提交事务
3.2 批量操作优化

使用批量插入代替逐条插入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 不推荐
INSERT INTO logs (msg) VALUES ('a');
INSERT INTO logs (msg) VALUES ('b');
-- 推荐
INSERT INTO logs (msg) VALUES ('a'), ('b');

4.架构优化

数据量比较大时,可采取以下措施:

  1. 读写分离:采用数据库的读写分离架构,将读操作和写操作分布到不同的数据库服务器上。这样可以减轻主数据库的负载,提高读操作的性能。在查询每个年龄段的用户时,可以将查询请求发送到从数据库上,从而提高查询的并发处理能力和响应速度。
  1. 分库分表:单表行数超过 500 万行或者单表容量超过 2GB,推荐进行分库分表。
  1. 分布式数据库:使用大数据下性能更好的分布式数据库,例如 TiDB 分布式数据库提升性能。

5.硬件和配置优化

5.1 数据库配置优化
  1. 调整缓存参数:增大 innodb_buffer_pool_size(建议分配 50%-80% 可用内存)以提高读取性能。
  2. 优化日志参数:增大 innodb_log_file_size 和 innodb_log_buffer_size,减少磁盘写入。
5.2 提升硬件配置
  1. 使用 SSD 硬盘:提升 IO 操作性能。
  2. 增加内存容量:足够的内存可以减少磁盘 I/O 操作。
  3. 选择多核处理器:多核 CPU 可以更好地支持高并发查询,提升系统的整体吞吐量。
  4. 升级网络设备:使用高速网络接口卡可以提高数据传输速度。

小结

MySQL 常见的优化手段包含 5 大类,索引优化、SQL 优化、事务和锁优化、架构优化和硬件及配置优化。你还知道哪些优化手段呢?欢迎评论区留下你的答案。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大表性能优化:从问题到解决方案
在进行优化之前,我们需要先了解大表性能问题的根本原因。当数据量增大时,数据库的性能为什么会下降?
用户11397231
2025/01/27
920
大表性能优化:从问题到解决方案
如何去写一手好SQL?
博主负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。导出日志后分析,主要原因竟然是没有命中索引和没有分页处理。其实这是非常低级的错误,我不禁后背一凉,团队成员的技术水平亟待提高啊。改造这些SQL的过程中,总结了一些经验分享给大家,如果有错误欢迎批评指正。
芋道源码
2019/10/08
3060
如何去写一手好SQL?
如何写出一手好 SQL ?很有必要!
点击关注公众号,Java干货及时送达 来源:编码砖家   链接:cnblogs.com/xiaoyangjia/p/11267191.html 背景 最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。导出日志后分析,主要原因竟然是没有命中索引和没有分页处理 。 其实这是非常低级的错误,我不禁后背一凉,团队成员的技术水平亟待提高啊。改造这些SQL的过程中,总结了一些经验分享给大家,如果有错误欢迎批评指正。 MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓 。MySQL没有限制单表最大记
Java技术栈
2022/05/12
5310
如何写出一手好 SQL ?很有必要!
MySQL面试题(最全、超详细)——定位慢查询、聚簇索引、覆盖索引、深分页优化、sql优化、并发事务问题、隔离级别、undo log与redo log、主从同步
查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
寻求出路的程序媛
2024/06/25
1.2K0
MySQL面试题(最全、超详细)——定位慢查询、聚簇索引、覆盖索引、深分页优化、sql优化、并发事务问题、隔离级别、undo log与redo log、主从同步
写一手好SQL,你该从哪里入手?
有时候我们会遇到:在查询sql的时候,假如有100w条数据,会出现慢sql告警,这个时候你就应该到处sql日志来查找原因了。这里很有可能的主要原因就是没有命中索引和没有分页处理(原因有很多种,主要分析你的日志)。那接下来我们就得去优化sql了。
友儿
2022/09/11
1.2K0
面试官:说说MySQL调优?
MySQL 作为关系型数据库的典型代表,其流行程度超越于任何数据库,因此在 Java 面试中,MySQL 是一定会被问到的重要知识点。而在 MySQL 中有一道极其常见的面试题,我们这里系统的来看一下,这就是我们今天要讨论的 MySQL 调优问题。
磊哥
2024/08/08
1560
MySQL 优化方法浅析
在开始之前,推荐大家阅读一篇文章《手撸了一个文件传输工具》https://cloud.tencent.com/developer/article/2472576,该文章分享手撸文件传输工具的全过程,包括需求、技术点、编码及效果,收获了对 TCP 编程的理解,有兴趣的朋友可以去了解下。
一杯茶Ja
2024/12/01
1040
MySQL简单基础优化方案
总结:最主要的优化策略还是索引优化和SQL优化,之后就是再调整下Mysql的配置参数,想读写分离、分库分表在系统架构设计的时候就需要确定,后续变更的成本太高。
bug开发工程师007
2023/09/08
2640
写好SQL很有必要
最近很多朋友来交流关于数据分析中的SQL技能需求,昨天看了这篇文章,写的很好,给大家推荐一下,其中关于数据表设计、SQL优化部分需要重点阅读,第一部分「MySQL性能」了解即可,全文共5758字,阅读大概需要20分钟,建议收藏,以下是作者自诉。
数据森麟
2020/02/20
5760
面试官:说说MySQL调优?
**避免使用 SELECT ***:尽量指定需要查询的列,如 SELECT id, name FROM users。
用户11397231
2024/12/27
1090
面试官:说说MySQL调优?
这篇3万字的Java后端面试总结,面试官看了瑟瑟发抖(四)
垂直分库是基于业务分类的,和我们常听到的微服务治理观念很相似,每一个独立的服务都拥有自己的数据库,需要不同业务的数据需接口调用。而垂直分库也是按照业务分类进行划分,每个业务有独立数据库。
Lvshen
2022/05/05
7870
这篇3万字的Java后端面试总结,面试官看了瑟瑟发抖(四)
MySQL 海量数据优化(理论+实战) 吊打面试官
可以看到比起之前 limit 1000000时的0.218s 效率也同样提高了很多
CPP开发前沿
2022/06/04
4860
MySQL 海量数据优化(理论+实战) 吊打面试官
MySQL - 分库分表
主从模式对于写少读多的场景确实非常大的优势,但是总会写操作达到瓶颈的时候,导致性能提不上去。
Vincent-yuan
2021/10/09
6.1K0
MySQL - 分库分表
MySQL面试题全解析:准备面试所需的关键知识点和实战经验
MySQL支持多种数据存储引擎,其中最常见的是MyISAM和InnoDB引擎。可以通过使用"show engines"命令查看MySQL支持的存储引擎。
努力的小雨
2023/11/09
3800
面试官:你的项目有哪些难点?
项目难点是指在项目执行过程中遇到的具有挑战性、复杂性或不确定性的问题和障碍,这些问题可能会影响项目的进度、质量、成本和目标的实现。
磊哥
2024/08/02
3890
相关推荐
大表性能优化:从问题到解决方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验