zoukankan      html  css  js  c++  java
  • 记一次mysql慢查询优化

    问题背景

    线上监控发现mysql慢查询,mysql最大执行时间60s,接口p99耗时1.88s

    优化记录

    检查索引

    show create table xxx
    

    线上query条件比较复杂,有接近10个查询字段,主要字段都已经加索引

    检查索引顺序

    explain select x from x where 1=1  and xxx and xxx2 order by x limit x offet x
    

    抓取log中的慢查询sql,发现已经命中索引,并且sql中无复杂计算,索引条件生效,过滤数据从百万减少到千级
    sql中的1=1是为了方便拼接where条件,防止where空查询

    进一步定位

    将where条件拆分排列组合,发现加了sort by id后导致查询很慢
    检查表内容,发现有一个text字段特别大,

    检查mysql排序变量大小

    show VARIABLES like '%sort%'
    

    其中 sort_buffer_size=262144,初步定位问题是字段太大,排序缓冲太小,导致排序变慢

    sort_buffer_size:是MySql执行排序使用的缓冲大小。 如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。 如果不能,可以尝试增加sort_buffer_size变量的大小。 read_rnd_buffer_size:是MySql的随机读缓冲区大小。

    优化

    修改sql条件,先查id再查具体的内容,只通过id过滤可以减少排序缓冲占用,另外也可以增加 sort_buffer_size 大小

    select x from x where id in (select id from x where xxx limit x offset x)
    

    结果

    接口p99和avg从1.8s减少到900ms,优化 50%+

    时间会记录下一切。
  • 相关阅读:
    到底该不该熟悉掌握struts2的ONGL呢?
    struts2 request内幕 为什么在struts2用EL表达式可以取值
    struts2 权限拦截器 拦截没有登陆的请求
    tomcat context 配置 项目部署
    tomcat 设置默认编码格式
    工作记录1
    javascript 的学习笔记(第一天)
    JavaScript for...in 循环
    indexof方法区分大小写
    java 和 IntelliJ IDEA 的一些配置
  • 原文地址:https://www.cnblogs.com/bincoding/p/15107827.html
Copyright © 2011-2022 走看看