• 如何分析和优化慢sql语句


    前言

    sql查询速度比较慢容易成为性能瓶颈,这时我们可以优化我们的sql语句或数据库表

    一般sql语句执行很慢的种类分为:

    1.聚合查询

    2.多表查询

    3.表数据量过大查询

    4.深度分页查询

    这四种的前三种都可以通过优化sql语句来优化sql查询速度

    正文

    聚合查询

    我们可以通过尝试新增一个临时表来解决

    多表查询

    可以试着优化sql语句的结构

    表数据量过大查询

    可以添加索引

    出现回表查询

    在业务允许的情况下只查询当前索引表中包含的字段(覆盖索引查询)来防止查询多个索引结构

    超大索引查询

    比如将

    select * from tab limit 9999999,10;

    优化为

    1. select * from tab t,
    2. (select id from tab order by id limit 9999999,10) a
    3. where t.id=a.id;

     这样先通过子查询拿到对应的id表a(覆盖索引查询),然后在通过主键查询,这样速度就会快一些

    通过sql执行计划来分析并优化sql语句

    我们可以给普通的sql语句前面加上desc来分析此sql语句的执行计划

    执行结果如下:

    possible_keys

    表示当前sql中可能会使用到的索引(可能多个)

    如果查询比较慢,且此值没有关联到索引,可以通过增加索引来优化查询速度

    key

    表示当前sql实际命中的索引

    如果 possible_keys 不为 null 而 key 为 null, 则说明未命中索引,这时可以优化sql语句使其命中索引

    key_len

    表示索引占用的大小

    key_len 和 key 可以看出是否命中了索引

    Extra

    额外的优化建议

    type

    表示这条sql的连接的类型

    性能由好到差(性能好一般要在range及以上):

        NULL: 表示查询的时候没有使用到表(项目中一般不会使用)

        system: 查询mysql系统中自带的表(项目中一般不会使用)

        const: 根据主键索引查询时(只会查询一条数据,性能好)

        eq_ref: 根据主键索引或唯一索引查询时(只会查询一条数据)

        ref: 使用了索引查询(可能查询出多条数据)

        range: 使用了索引,但是是范围查询

        index: 使用索引树扫描(全索引查询)

        all: 全盘扫描(效率最低)

    对Kotlin或KMP感兴趣的同学可以进Q群 101786950

    如果这篇文章对您有帮助的话

    可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)

  • 相关阅读:
    领域模型优先于数据库表
    一键部署监控
    程序化广告还有未来么?(4/5)——程序化领域变化的底层逻辑和反思
    吃透Redis(四):网络框架篇-多路复用器
    后端编写Swagger接口管理文档
    Python网页应用开发神器fac 0.2.10版本新功能介绍
    JS原理-笔记(1/3)
    计算机组成原理——中央处理器-异常和中断机制(课程笔记)
    大厂排兵布阵NFT
    驱动LSM6DS3TR-C实现高效运动检测与数据采集(5)----姿态解算
  • 原文地址:https://blog.csdn.net/qq_33505109/article/details/138199932