mysql数据库的sql优化以及explain周期字段详解案例【爽文】

目录

一  慢sql优化

1.1 策略

1.1.1 对于in语句的优化

1.1.2 索引字段使用函数或计算,索引功能失效

1.1.3 为高频建立索引

1.1.4 批量操作:大幅减少IO次数

1.1.5 谨慎设置null值

1.2 案例

1.3  慢sql的开启

1.4  数据库:定期检查

二   explain执行周期分析

2.1 sql执行效率分析

2.2 执行周期字段分析

2.3 字段分析

2.3.1 Extra为NULL

2.3.2 Extra为using where

2.3.3 Extra为MRR

2.3.4 extra:using join buffer

2.3.5 extra:using temporay

2.3.6 extra:using filesort

2.3.7 extra:range checked for each record

2.4 案例讲解

2.5 设置索引后数据量大失效


一  慢sql优化

1.1 策略

1.1.1 对于in语句的优化

MySQL 的优化器在处理IN时,会先把子查询结果放到一个临时表,然后在外层表里逐行对比。这个过程相当于你拿着5万人的名单挨个查。优化方法

1.使用exits  代替in;2.使用left join+is null代替 not in

https://mp.weixin.qq.com/s/8MBt_MxywSB3v3caARIeHg

1.1.2 索引字段使用函数或计算,索引功能失效

 对索引字段使用函数会使索引失效,变成全表扫描

SELECT * FROM orders WHERE DATE_FORMAT(create_time, '%Y-%m-%d') = '2024-01-01';

改为:使用范围查询

SELECT * FROM orders WHERE create_time >= '2024-01-01' AND create_time < '2024-01-02';

SELECT * FROM products WHERE price + 100 > 500;改为:

SELECT * FROM products WHERE price > 400;

1.1.3 为高频建立索引

针对不同场景,设置索引

1.1.4 批量操作:大幅减少IO次数

性能提升:插入1000条数据,批量操作比单条插入快50倍!

1.1.5 谨慎设置null值

设置成默认值,不用null

1.2 案例

优化结果: 2.3s → 0.02s

SELECT * FROM orders 
WHERE user_id = 123 
AND status IN ('paid', 'shipped') 
AND create_time BETWEEN '2024-01-01' AND '2024-06-30'
ORDER BY create_time DESC;

优化方案:创建复合索引

CREATE INDEX idx_orders_user_status_time ON orders(user_id, status, create_time);

1.3  慢sql的开启

1.慢sql的配置

2.慢sql的查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值