【MySQL】慢查询优化

一 SQL的执行过程

在这里插入图片描述

1、首先查询缓存(这一步骤新版本MYSQL已经不用了)
2、解析器进行解析
3、优化器进行优化
4、执行语句

二 慢查询

2.1 慢查询的危害

慢查询–>连接池打满–>超时异常–>操作失败–>用户重试–>情况继续恶化–>MySQL继续恶化

2.2 索引的结构

1、每一个数据页都是16K,仅仅叶子节点存储数据。
2、多叉树,减少层高,减少IO的次数。
3、叶子节点之间是双向链表。
B+树的优点:
1、减少了层高,减少了IO次数。

2.3 慢查询的优化

2.3.1 explain

explain相关的含义:
1、 type:
(1)ALL 表示 全表扫描。
(2)Index: 扫描全部索引。
(3)range: 范围扫描。
(4)ref:索引查询,匹配单值。
(5)const: 主键或者唯一键,只匹配一行。
2、key: 使用到的索引
3、rows:预估扫描的行数
4、extra:using fileSort、using temporary 使用了排序和临时表,排序不一定是文件排序。

2.3.2 优化的思路

从底到上,分为四个模块,分别是
(1)索引层: 索引区分度不高、没有索引
(2)SQL层: limit使用过大、错误使用索引(联合索引使用不当)
(3)表层面: 数据量过大
(4)应用层: 使用当前读锁表

索引层的优化

案例一 没有使用索引
案例二 回表导致全表扫描

select * from tmp where 'name' = tom and 'age' = 17;

因为二级索引不包含查询的字段,所以需要进行回表查询,如果需要回表的数据量超过了20%,则mysql会进行全表扫描。
索引使用效率低
索引对应的行数比较多。
解决办法: 如果查询条件比较多,建立联合索引。
内存排序
使用到了order by 语句,但是字段未建立对应的索引,导致使用到了内存排序或者文件排序。

语句层的优化

(1)limit offset模式的深分页优化为通过主键id的分页方式.
(2)减少SQL事务的范围,将查询语句移出到事务外。

表层面

单表数据量过大,将不用的数据进行归档。

应用层

建立缓存,降低对数据库的查询次数。

总结

1、禁止使用select * for update语句
2、单表大小禁止超过1kw
3、注意索引的区分度(count(discount(列名字) )/ count(*)) 计算索引区分度

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于MySQL慢查询优化,有几个常见的方法和技巧可以尝试: 1. 确定慢查询:首先使用MySQL慢查询日志或性能分析工具(如Percona Toolkit)来确定哪些查询较慢。这样可以帮助你了解具体的问题。 2. 优化查询语句:检查慢查询中的SQL语句并进行优化。你可以考虑添加适当的索引以提高查询性能,或者重写复杂的查询语句以简化其逻辑。 3. 优化数据库结构:检查数据库表的设计和结构,确保表中的字段类型、索引和约束等设置是合理的。合理的数据库设计可以提高查询性能。 4. 避免全表扫描:尽量避免在大表上执行全表扫描操作,可以通过添加索引或者改进查询条件来避免全表扫描。 5. 调整系统配置参数:根据数据库负载和硬件性能,调整MySQL的配置参数,如缓冲区大小、连接池大小等,以提高系统性能。 6. 使用缓存:考虑使用缓存技术(如Redis)来缓存常用的查询结果,减轻数据库的压力。 7. 分离读写操作:将读操作和写操作分离到不同的数据库实例或服务器上,可以提高数据库的并发性能。 8. 使用慢查询日志或监控工具:定期分析慢查询日志,或者使用监控工具(如Prometheus和Grafana)来实时监测数据库性能,并及时调整和优化。 这些是一些常见的MySQL慢查询优化方法,具体的优化策略需要根据具体情况进行调整和实施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值