主要流程“定位-分析-优化

1、开启慢查询日志 ,MySQL 自带的核心排查工具,它会自动记录执行时间超过指定阈值的 SQL。

临时开启:

-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
-- 阈值,生产环境建议设为 0.5 或 1 秒
SET GLOBAL long_query_time = 1; 

永久开启:在 MySQL 的配置文件(my.cnf 或 my.ini)中添加相关配置并重启服务。

2、实时查看正在执行的 SQL:使用 SHOW PROCESSLIST,可以实时查看当前数据库中正在运行的线程,找到长时间卡住、未结束的 SQL 语句。

3、使用 EXPLAIN 深度分析:根据上一步找到的慢 SQL ,千万不要上来就盲目加索引,最好在 SQL 语句前加上 EXPLAIN 关键字,查看 MySQL 的执行计划,找出性能瓶颈。

EXPLAIN SELECT * FROM `order` WHERE user_id = 1001 AND status = 1;

然后根据分析结果可做以下优化:

1、索引优化(成本低,效果显著)

        为高频过滤字段加索引:给 WHERE 条件、JOIN 连接以及 ORDER BY / GROUP BY 涉及的字段建立合理的索引。

        遵循最左前缀原则:如果是联合索引(例如 (a, b, c)),查询条件必须包含最左侧的字段 a,否则索引会失效。

        避免索引失效:不要在索引列上做函数运算(如 WHERE YEAR(create_time) = 2026)、隐式类型转换或使用左模糊查询(如 LIKE '%关键词'),会让索引失效。

2. SQL 语句改写

        非必要别SELECT *:只查询业务真正需要的字段,减少网络传输的数据量,可以增加“覆盖索引”命中的几率。

        优化分页查询:面对大偏移量的分页(如 LIMIT 100000, 10),可以使用延迟关联或子查询优化,避免扫描大量无效数据。

        用 JOIN 替代子查询:在大多数场景下,多表连接(JOIN)的执行效率要优于复杂的嵌套子查询。

        用小结果集驱动大结果集:在多表连接时,尽量让数据量小的表作为驱动表。

3. 架构与表结构优化

        缓存层:对于高频且变动不频繁的热点数据(如商品详情、用户基础信息),接入 Redis 等缓存,直接从内存读取,减轻数据库压力。

        合理分表与归档:当单表数据量达到千万级甚至亿级时,可以考虑水平分表,或者将早期的历史冷数据迁移到归档表中,保持主表的轻量。

        选择合适的数据类型:在满足业务需求的前提下,尽量使用占用空间更小的数据类型(如用 TINYINT 代替 INT 存储状态),能提升磁盘 I/O 和内存利用效率。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐