如何优化慢SQL,提高MySQL性能

SQL优化

  • 打开慢SQL日志
-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
-- 设置慢查询的时间阈值,单位为秒,这里设置为 5 秒
SET GLOBAL long_query_time = 5;

慢SQL模拟

-- 创建测试数据库
CREATE DATABASE IF NOT EXISTS test_db;

-- 使用测试数据库
USE test_db;

-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
-- 设置慢查询的时间阈值,单位为秒,这里设置为 5 秒
SET GLOBAL long_query_time = 5;
-- 查询慢查询日志的存储文件路径
SHOW VARIABLES LIKE 'slow_query_log_file';


-- 创建测试表
CREATE TABLE IF NOT EXISTS users (
     id INT AUTO_INCREMENT PRIMARY KEY,
     name VARCHAR(100),
     age INT,
     email VARCHAR(255)
);
-- 给name创建索引
CREATE INDEX idx_name ON users (name);
-- 插入大量数据
DELIMITER //
CREATE PROCEDURE insert_large_data()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= 100000 DO
            INSERT INTO users (name, age, email) VALUES (CONCAT('User', i), FLOOR(RAND() * 100), CONCAT('user', i, '@example.com'));
            SET i = i + 1;
    END WHILE;
END //
DELIMITER ;

-- 调用存储过程插入数据,慢SQl插入10万条
CALL insert_large_data();

执行SHOW VARIABLES LIKE 'slow_query_log_file;可以看到慢SQL文件路径
在这里插入图片描述

在服务器上查看慢SQL日志文件

使用tail -100f '日志文件路径'可以看到超过设定阈值时间的日志记录,有详细的记录信息,此外还可以使用mysqldumpslow进行统计分析。
在这里插入图片描述

慢SQL分析

现在可以进行慢SQL分析,这里为了模拟执行了如下SQL语句,可以看到慢SQL日志的记录,查询了十几分钟,基本等于瘫痪了,但是在实际场景当中我们不应该出现这种情况,在此总结一下常用的SQL优化

SELECT sleep(10) as delay_time, age,email FROM users WHERE age = 30;

在这里插入图片描述

SQL优化,提高mysql的性能

  1. 避免使用select *查询,避免全表扫码,举个例子像消息通知,如果他是一个千万粉丝博主,可以会受到许多消息但是他并不需要看到全部信息,只有在他点击信息时才需要查看到完整的信息,因为我们在查询时可以返回必要的字段,不使用select *,可能我举得不是很合理,欢迎大家进行指正。
  2. 创建索引
  • 选择具有区分度的字段创建索引
  • 对应经常查询的字段创建索引
  • 合理进行索引覆盖,减少回表查询
  • 前缀索引
  • 联合索引
  • 欢迎留言补充
  1. 减少索引失效,导致索引常见情况
  • 模糊查询:like %玉,like %玉%
  • 在索引字段使用函数
  • 在索引字段触发隐式类型转换
  • 在索引字段进行表达式计算
  • 联合索引的最左匹配原则
  • or 关键字使用
  1. 上述提高的慢SQL日志记录
  2. 还有其他方法,欢迎补充
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值