美文网首页
mysql 慢sql优化记录 覆盖索引 减少回表

mysql 慢sql优化记录 覆盖索引 减少回表

作者: 爱吃赵一鸣 | 来源:发表于2024-09-04 09:04 被阅读0次

最近在分析一条SQL,这条SQL执行时间去到2秒以上。SQL如下:

select

        count(d.id) 

    from

        t_msg d 

    where

        d.userid='12456' 

        and d.isread=0   

        AND d.msgnumber<> '5555'

表上索引有 idx_userid(userid),这条SQL是一条比较标准的统计SQL,涉及字段也少。

虽然表数据有一百多万,但加了索引,explain一下只扫描记录5w多,按道理耗时很少。仔细分析是查询语句中用到了非索引字段,如果能把语句中涉及到的字段都加入索引,这样SQL在执行中可以减少回表时间,回表时间在SQL执行中占比挺大的。

马上修改索引 idx_userid(userid,isread,msgnumber),执行一下只耗时0.5秒了。这里isread和msgnumber两列的值属于枚举类型,加入索引在查询时效果没那么大,而且msgnumber这里是<>,用不上索引。会有人认为对这两个字段加索引没意义,但如果从减少回表的角度考虑,加索引意义很大

后面又碰到一条类似的SQL

select

        count(*) as "ALL",

        sum(CASE

            WHEN d.code='A' THEN 1

            ELSE 0

        END) AS "A",

        sum(CASE

            WHEN d.code='B' THEN 1

            ELSE 0

        END) AS "B",

        sum(CASE

            WHEN d.code='C' THEN 1

            ELSE 0

        END) AS "C",

        sum(CASE

            WHEN d.code='D' THEN 1

            ELSE 0

        END) AS "D",

        sum(CASE

            WHEN d.code='E' THEN 1

            ELSE 0

        END) AS "E",

        sum(CASE

            WHEN d.code='F' THEN 1

            ELSE 0

        END) AS "F",

        sum(CASE

            WHEN d.code='G' THEN 1

            ELSE 0

        END) AS "G" 

    FROM

        t_msg d

    WHERE

        1=1       

        AND d.msgitemnumber <> 'NEW-JCPT003'                   

        and d.userid='123456' limit 1

二话不说直接修改索引idx_userid(userid,isread,msgnumber,code) ,耗时也降到0.5秒以下了

相关文章

  • Mysql 相关

    MySQL索引 MySQL索引背后的数据结构及算法原理 覆盖索引和回表操作 MySQL性能优化 MySql表分区详...

  • 5.数据库索引

    回表:回到主键索引树搜索的过程。 如何优化索引避免回表过程? 1. 覆盖索引: mysql> create tab...

  • Mysql查询优化

    mysql的优化思路: 日志、执行计划、索引、缓存(查询缓存和索引缓存)、SQL优化、分区、分表、分库、修改数据库...

  • MySQL中的回表查询与索引覆盖

    了解一下MySQL中的回表查询与索引覆盖。 回表查询 要说回表查询,先要从InnoDB的索引实现说起。InnoDB...

  • sql优化的几种方法

    Mysql的优化,大体可以分为三部分:索引的优化,sql语句的优化,表的优化 1.索引的优化 只要列中含有NULL...

  • 千万级MySQL数据库建立索引,提高性能的秘诀

    实践中如何优化MySQL 实践中,MySQL的优化主要涉及SQL语句及索引的优化、数据表结构的优化、系统配置的优化...

  • MySQL优化----SQL语句和索引优化

    sql及索引优化 如何发现有问题的sql? 使用Mysql的慢查询日志对有效率问题的SQL进行监控 慢查询日志所包...

  • 2021-08-09 MySQL性能优化总结

    MySQL性能优化层面 SQL和索引层面优化 Explain 小结 嵌套查询一般是从外到内进行;小表驱动大表 --...

  • MySQL索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降...

  • 对于Mysql索引的理解(二)

    对于Mysql的索引有很多比较专业的词汇,这次就来讲讲这些回表查询、索引覆盖、最佳左前缀、索引下推。 1. 回表查...

网友评论

      本文标题:mysql 慢sql优化记录 覆盖索引 减少回表

      本文链接:https://www.haomeiwen.com/subject/wnykljtx.html