返回顶部
分享到

MySQL慢查询定位与SQL性能优化实战教程

Mysql 来源:互联网 作者:佚名 发布时间:2025-12-17 21:39:23 人浏览
摘要

如何定位并解决慢查询? 1. 开启/检查慢日志 看一下是否开启慢日志 1 2 3 SHOW VARIABLES LIKE slow_query_log; SHOW VARIABLES LIKE long_query_time; SHOW VARIABLES LIKE slow_query_log_file; 如果未开启,临时开启(生产环

如何定位并解决慢查询?

1. 开启/检查慢日志

  • 看一下是否开启慢日志

1

2

3

SHOW VARIABLES LIKE 'slow_query_log';

SHOW VARIABLES LIKE 'long_query_time';

SHOW VARIABLES LIKE 'slow_query_log_file';

  • 如果未开启,临时开启(生产环境建议永久配置):

1

2

SET GLOBAL slow_query_log = ON;

SET GLOBAL long_query_time = 1;

2. 分析日志

mysqldumpslow(MySQL 自带)

1

2

3

4

# 按执行次数排序前10条

  mysqldumpslow -s c -t 10 /var/log/mysql/slow.log

  # 按总耗时排序前10条

  mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

3. 用explain分析执行计划

在SQL前面加explain

1

2

3

4

EXPLAIN SELECT id, order_no

FROM orders

WHERE user_id = 100 AND create_time >= '2024-01-01'

ORDER BY create_time DESC;

  • 重点查看四个字段
字段 看什么
type 是否出现 ALL(全表扫描)
rows 扫描行数是否过大
key 是否使用到了正确索引
Extra 是否出现 Using filesort 或 Using temporary

SQL优化?

一、基础优化

1. 避免select *

1

2

3

4

-- ? 不推荐

SELECT * FROM users;

-- ? 推荐

SELECT id, name, email FROM users;

2. 使用合适的where条件

  • 尽量在where中使用索引字段
  • 避免对字段进行函数操作或类型转换(导致索引失效)

1

2

3

4

5

6

7

8

-- ? 索引失效

SELECT *

FROM orders

WHERE YEAR(create_time) = 2024;

-- ? 使用范围查询,可走索引

SELECT *

FROM orders

WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01';

3. 合理使用索引

  • 对经常用于where、join、order by、group by的列建立索引
  • 比卖你过度索引(影响写入性能)
  • 考虑使用复合索引(最左前缀原则)

4. 避免全表扫描

通过explain检查是否使用了索引

1

EXPLAIN SELECT * FROM products WHERE category_id = 10;

二、JOIN优化(多表查询)

1. 大表驱动小表

  • 在MySQL中,通常将小结果姐放在left,大表在right

2. 确保JOIN字段都有索引

  • 两个表关联字段都应该有索引

3. 避免多层嵌套JOIN

  • 复杂JOIN可拆分为多个简单查询

三、子查询 vsJOIN

子查询在某些数据库中效率较低,可以尝试改成JOIN

1

2

3

4

5

6

7

8

9

-- ? 子查询(可能低效)

SELECT *

FROM users

WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);

-- ? 改写为

JOIN SELECT DISTINCT u.*

FROM users u

JOIN orders o ON u.id = o.user_id

WHERE o.amount > 100;

分页优化

  • 深分页(如LIMIT 100000,20)性能查,因为要跳过大量的数据
    • 优化方案:
      • 使用游标分页(基于上一页最后一条记录的ID或时间):

1

2

3

4

5

6

?

SELECT * FROM messages

WHERE id > 100000

ORDER BY id

LIMIT 20;

?

如何创建、使用索引?

索引介绍

索引类型 说明
主键索引 聚簇索引,数据按主键物理存储,每一张表只能一个
唯一索引 不允许出现重复值
普通索引 最基本的索引,允许重复和null
全文索引 用于文本搜索
前缀索引 对字符串类的前N个字段创建索引,节省空间
覆盖索引 非独立类型,查询字段全部包含在索引中,无需回表

一、创建索引

1. 创建普通索引

1

2

3

4

-- 方法1:CREATE INDEX(推荐用于已有表)

CREATE INDEX index_name ON table_name (column_name);

-- 示例:在 users 表的 email 字段上创建索引

CREATE INDEX idx_email ON users (email);

2. 创建唯一索引

1

CREATE UNIQUE INDEX idx_username ON users (username);

3. 创建复合索引

  • 符合索引使用时必须遵循最左前缀原则,查询时必须包含最左边的列才能生效

1

2

-- 按顺序:先按 category_id,再按 created_at 排序

CREATE INDEX idx_category_created ON products (category_id, created_at);

4. 在建表时直接定义索引

1

2

3

4

5

6

7

8

9

CREATE TABLE orders (

    id BIGINT PRIMARY KEY AUTO_INCREMENT,

    user_id INT NOT NULL,

    status VARCHAR(20),

    created_at DATETIME,

    -- 主键自动创建聚簇索引(InnoDB)

    INDEX idx_user_status (user_id, status), -- 普通复合索引

    UNIQUE INDEX uk_order_no (order_no) -- 唯一索引

    );

5. 添加主键(自动添加聚簇索引)

1

ALTER TABLE table_name ADD PRIMARY KEY (id);


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • MySQL慢查询定位与SQL性能优化实战教程
    如何定位并解决慢查询? 1. 开启/检查慢日志 看一下是否开启慢日志 1 2 3 SHOW VARIABLES LIKE slow_query_log; SHOW VARIABLES LIKE long_query_time; SHOW VARIAB
  • MYSQL的安装与介绍

    MYSQL的安装与介绍
    MySQL 是一款开源的关系型数据库管理系统(RDBMS),由瑞典 MySQL AB 公司开发,后被 Sun 收购,最终归属于 Oracle 公司。它以轻量、高性能、易
  • MySQL的REPLACE 函数用途与语句介绍

    MySQL的REPLACE 函数用途与语句介绍
    MySQL 的REPLACE有两个不同的用途,分别是: REPLACE()函数:用于字符串替换。 REPLACE INTO语句:用于插入或替换整行记录(类似INSERT INTO ... ON
  • Mysql表的内联和外联区别
    表的连接分为内连和外连 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面文章的查询都是内连接,也是
  • MySQL CTE (Common Table Expressions)的介绍
    CTE (Common Table Expression,公共表表达式) 是 MySQL 8.0 引入的重要特性,它允许在查询中创建临时命名结果集,提高复杂查询的可读性和可维护性
  • SQL Server中的WITH(NOLOCK)介绍
    SQL Server 中的 WITH (NOLOCK) 详解 一、WITH (NOLOCK) 的本质 WITH (NOLOCK) 是 SQL Server 中的表提示(Table Hint),等同于 READUNCOMMITTED 隔离级别,它指示 SQ
  • MySQL强制使用特定索引的操作
    在MySQL中,你可以通过多种方式强制查询使用特定的索引,这在优化查询性能时非常有用,特别是当查询优化器没有选择最佳索引时。 1. 使
  • Navicat数据表的数据添加,删除及使用sql完成数据的

    Navicat数据表的数据添加,删除及使用sql完成数据的
    Navicat数据表数据添加,删除及使用sql完成数据添加 选中操作的表 右击----打开表(或者直接双击也行) 则出现如下界面,查看左下角 从左到右
  • 从入门到精通MySQL数据库索引(实战案例)
    一、索引是什么?能干嘛? 类比理解:索引就像书的目录。比如你想查《哈利波特》中 伏地魔 出现的页数,不用逐页翻书,直接看目录找
  • MySQL中DISTINCT去重的核心注意事项
    DISTINCT 六大注意事项 1. 作用范围:所有 SELECT 字段 1 SELECT DISTINCT a, b FROM table; -- 对(a,b)组合整体去重 误以为只作用于第一个字段: 1 2 -- 错误
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计