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