zoukankan      html  css  js  c++  java
  • 记录一次sql优化查询

    场景:关联查询,一张主表关联4张表进行查询。主表数据量是16万,其中被关联的一张表的数量是6万。

    遇到页面响应速度过慢的情况,首先考虑是否是sql查询缓慢引起的。

    第一步开启mysql的慢查询日志(网上教程很多,本篇文章不再赘述)

    第二步分析慢查询日志,这里要说下分析工具。常用的有两种,一是mysql自带的mysqldumpslow工具,二是pt-query-slow工具。后者需要自行安装,下面针对两种工具的使用进行说明:


    (1) mysqldumpslow
     执行mysqldumpslow,如果出现命令mysqldumpslow不存在的情况,需要进行如下处理(要清楚mysql的安装位置):

    ln -s /www/server/mysql/bin/mysqldumpslow /usr/bin/
    

     简单使用:

    mysqldumpslow -t 10 mysql-slow.log
    

     含义:返回查询时间最慢的前10条记录
     相关参数:
      -s:是表示按照何种方式排序
       c:访问计数
       l:锁定时间
       r:返回记录
       t:查询时间
      al:平均锁定时间
      ar:平均返回记录数
      at:平均查询时间
      -t:是top n的意思,即为返回前面多少条的数据
      -g:后边可以写一个正则匹配模式,大小写不敏感的
    (2) pt-query-slow
     安装:

    yum install perl-DBI  
    yum install perl-DBD-MySQL  
    yum install perl-Time-HiRes  
    yum install perl-IO-Socket-SSL  
    wget percona.com/get/pt-query-digest  
    chmod u+x pt-query-digest  
    mv pt-query-digest /usr/bin/
    

     使用:

    pt-query-digest  /www/server/data/mysql-slow.log
    

     常见用法:
     (1)分析最近12小时内的查询

    pt-query-digest --since=12h /www/server/data/mysql-slow.log > slow_report1.log
    

     (2)分析指定时间范围内的查询

    pt-query-digest /www/server/data/mysql-slow.log --since '2020-03-20 09:30:00' --until '2020-03-27 13:00:00'  > slow_report2.log
    

     通过查看找到耗时较长的sql:

    SELECT
     	`c`.*, 
           c.price unit_price,
    	d. NAME AS category_name,
    	b.nickname creator,
    	a.nickname owner_name
    FROM
    	`material` `c`
    LEFT JOIN `category` `d` ON `c`.`category_id` = `d`.`id`
    LEFT JOIN `admin` `a` ON `c`.`operator_id` = `a`.`id`
    LEFT JOIN `admin` `b` ON `c`.`creator_id` = `b`.`id`
     LEFT JOIN `stock` `s` ON `c`.`id` = `s`.`material_id`
    WHERE
    	`c`.`status` = '1'
    AND `c`.`company_id` = '1'
      ORDER BY
       	`c`.`created_at` DESC
      LIMIT 0,
       10
        

     对这条sql执行explain:

    id
    select_type
    table
    type
    possible_keys
    key
    key_len
    ref
    rows
    Extra
    1 SIMPLE c ref idx_company_id,
    idx_status
    idx_company_id 4 const 33872 Using where;
    Using temporary; 
    Using filesort
    1 SIMPLE d eq_ref PRIMARY PRIMARY 4 skxx.c.category_id 1  
    1 SIMPLE a eq_ref PRIMARY PRIMARY 4 skxx.c.category_id 1 Using where
    1 SIMPLE b eq_ref PRIMARY PRIMARY 4 =skxx.c.category_id 1 Using where
    1 SIMPLE s ALL         1683 Using where; 
    Using join buffer (Block Nested Loop)

    看到执行计划后发现第一行Extra出现了Using temporaryUsing filesort,最后一行出现Using join buffer (Block Nested Loop),这几项说明在查询时使用了临时表和文件排序,性能很不好。尝试给所有关联条件添加索引后,再次执行explain,发现Using temporary Using join buffer (Block Nested Loop)都不见了,但是仍然有文件排序!定位到 order by 发现列created_at并未添加索引,于是添加索引,再次执行explain,Using filesort已经没有了!!

    有关explain的使用,网上教程很多,这里不再详细介绍

  • 相关阅读:
    测测你是男是女
    密集恐惧症候群测试图
    弱智的我
    你还单纯么
    压力测试
    理性人与感性人
    [家里蹲大学数学杂志]第248期东北师范大学2013年数学分析考研试题
    [家里蹲大学数学杂志]第254期第五届[2013年]全国大学生数学竞赛[数学类]试题
    PostgreSQL中,如何查表属于哪个数据库
    对PostgreSQL中tablespace 与 database, table的理解
  • 原文地址:https://www.cnblogs.com/lty-fly/p/12619992.html
Copyright © 2011-2022 走看看