MySQL调优笔记——慢SQL优化记录(1)

这篇具有很好参考价值的文章主要介绍了MySQL调优笔记——慢SQL优化记录(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上周,项目出现线上问题,在这家公司做的是一个SAAS平台,总用户量大约10万人;

经过排查,发现是SQL问题,导致数据库响应慢,进而拖垮了整体服务;

通常,查询耗时较长的SQL涉及到的一些常见原因包括但不限于:数据量过大,查询未使用索引等

于是我们组开始全面摸牌对数据库查询性能影响较大的SQL,一些步骤记录如下:

1. 分析大数据库表

SELECT 
    TABLE_NAME '表名',
    DATA_LENGTH '数据长度',
    INDEX_LENGTH '索引长度',
    (DATA_LENGTH + INDEX_LENGTH) AS '总长度',
    TABLE_ROWS '行数',
    CONCAT(ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024,
                    3),
            'MB') AS '占用空间'
FROM
    information_schema.TABLES
WHERE
    TABLE_SCHEMA = '${你的数据库名称}'
ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;

        使用以上SQL可以查询出数据库的数据表统计信息,这个数据不是最新的但是接近最新,可以做一个大致的数据量参考,执行结果大致如下:

MySQL调优笔记——慢SQL优化记录(1)

基本上看占用空间或者数据行数,总量排名靠前的表是重点关注对象。

2. 查看阿里云数据库运行监控

        通过阿里云的云数据库监控工具导出了一份SQL的执行监控,用过阿里巴巴druid连接池的都知道,主要就是用来分析SQL的执行时长和执行频率的;

MySQL调优笔记——慢SQL优化记录(1)

这是一份2分钟执行记录的数据库执行记录,重点关注执行次数执行时长,针对性优化

3.  SQL优化

通过阿里云的数据库运行监控导出的监控记录,一条条优化,这里列举一条

SELECT * FROM device_p350_real_time_data a WHERE record_time = (SELECT max(record_time) FROM device_p350_real_time_data WHERE project_id = '32641235'  ) AND project_id = '32641235' ORDER BY record_time desc

这条SQL在监控中显示,平均执行 2秒,执行次数146秒;

3.1 EXPLAIN分析一下执行计划

MySQL调优笔记——慢SQL优化记录(1)

 可以看到,这个子查询 ( select max(record_time) from xxx) 扫描了接近300万行数据,造成了巨大的性能消耗;

3.2 分析一下SQL对应的业务

我这里的SQL是要获取当前物联网数据表中最新的一批数据,于是使用了where record time = max(record_time) 这样的写法,虽然record_time增加了索引,但是聚合函数没有用到索引,因此造成了全表扫描,子查询严重拖累了速度;

于是将这里的子查询逻辑稍作修改,将 where record_time = (select max(record_time) from xxx) 变成 where record_time = (select record_time from xxx order by record_time desc limit 1)

这样之后,由于MySQL对索引字段是使用的B+排序树,所以子查询只扫描一行数据;

再次EXPLAIN:

MySQL调优笔记——慢SQL优化记录(1)

执行耗时:0.371s

至此,一个最小单位的SQL优化已经结束,对1和2步骤扫描出来的 大表、执行耗时长的SQL重复进行类似3步骤的针对性调优,最终可以把整个系统的慢SQL都降下来,提高服务稳定性;

总结的话,就是尽量用到索引,编写查询语句的逻辑尽量使用更少的数据行扫描,不要对索引字段使用函数;文章来源地址https://www.toymoban.com/news/detail-423353.html

到了这里,关于MySQL调优笔记——慢SQL优化记录(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一次线上mysql 调优 ,join 的调优,索引优化(Block Nested Loop)

    原因: 某接口调用十分缓慢,通过 Explain 发现是SQL问题 可以看到,在Join连接时,出现了BNL查询,BNL出现是因为,JOIN连接时 dr表也就是 domian_redemption 被驱动的表上没出现可用的索引。 个人解决方法: 在对应的连接字段上,既dr的orderCode字段,内表加上索引,再次执行Explai

    2024年02月05日
    浏览(51)
  • MySQL进阶之性能优化与调优技巧

    1.1.2 介绍 多表查询:查询时从多张表中获取所需数据 单表查询的SQL语句:select 字段列表 from 表名; 要执行多表查询,只需要使用逗号分隔多张表即可,如: select 字段列表 from 表1, 表2; 查询用户表和部门表中的数据: 此时,我们看到查询结果中包含了大量的结果集,总共85条

    2024年02月05日
    浏览(60)
  • MySQL性能调优篇(4)-查询语句的优化与重构

    MySQL是一种常用的关系型数据库管理系统,广泛应用于Web开发中。在实际应用中,对数据库查询语句的优化和重构是提高应用性能和响应速度的重要手段。本文将介绍一些常见的优化技巧和重构方法,帮助开发者提高数据库查询效率。 优化索引 索引是数据库中存储数据位置的

    2024年02月19日
    浏览(51)
  • Sql Server获取表中今天、昨天、本周、上周、本月、上月等数据

    DATEDIFF ( datepart , startdate , enddate ) 释义:计算时间差 datepare值:year | quarter | month | week | day | hour | minute | second | millisecond startdate:开始日期 enddate :结束日期 GetDate() --用法 select datediff(year, 开始日期,结束日期); --(结束日期-开始日期)间隔年 select datediff(quarter, 开始日期,结束

    2024年02月10日
    浏览(47)
  • sql:SQL优化知识点记录(四)

    type下的ref是非唯一性索引扫描具体的一个值 ref属性 例如:ti表先加载,const是常量  t1.other_column是个t1表常量 test.t1.ID:test库t1表的ID字段        t1表引用了shared库的t2表的col1字段,t1.col2=‘’ac‘’是一个常量  t2表没有索引只有id主键,col1,col2没有建立索引      rows越少

    2024年02月10日
    浏览(49)
  • sql:SQL优化知识点记录(十一)

    新的一个优化的方式show Profile   运行一些查询sql: 查看一下我们执行过的sql   显示sql查询声明周期完整的过程:  当执行过程出现了下面这4个中的时,就会有问题导致效率慢  8这个sql创建了临时表导致sql变慢 Show Profile:记录了我们后台要开启的一些sql,全局查询日志呢,

    2024年02月09日
    浏览(86)
  • sql:SQL优化知识点记录(八)

    所谓索引:就是排好序的快速查找数据结构,排序家查找是索引的两个用途 select * 在where使用到了索引,当select *  有模糊查询%在左边索引会失效  当select * where后面索引的顺序发生变化,也会用到索引4个  我们where后面倒着排序,也会使用到索引4个 上面,因为有MySql查询优

    2024年02月10日
    浏览(38)
  • sql:SQL优化知识点记录(九)

    对sql调优的分析: 排序优化:  数据库的连接方式,里面的数据尽量这样连接,尽量选择第一个方式,因为两个表的连接一共建立5次连接,第二个建立1000次连接,从小表驱动大表方式来说选择第一种 B相当于部门, A是员工,通过部门id在部门表里面,部门是少量的,员工是

    2024年02月10日
    浏览(45)
  • sql:SQL优化知识点记录(三)

    简单的查询类型是:simple   外层 primary,括号里subquery  用到了临时表:derived   trpe反映的结果与我们sql是否优化过,是否是最佳状态息息相关 最简单的查询啥都没有改type就是all:表明的的检索是全表扫描   const:通过id查询,有索引查询很快  t1查询完之后作为一张临时表

    2024年02月10日
    浏览(48)
  • sql:SQL优化知识点记录(十五)

      我们这里配置一Windows上的MySql做主机,Linux上的MySql做从机,搭建一主一从 测试以下是否能够拼通:从Linux上:167,连接Windows的165 从Windows的165 连接Linux上:167,看是否拼通   修改配置文件:首先Windows:my.ni 主机配置文件修改: 从机配置文件修改:   注释掉server-id ,打开

    2024年02月09日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包