慢查询如何优化?(实战慢查询)

2023-05-16

慢查询如何优化?

  • 1. 数据库中设置SQL慢查询
  • 2. 分析慢查询日志
  • 3. 常见的慢查询优化
    • 3.1 索引没起作用的情况
    • 3.2 分拆关联查询
    • 3.4 limit偏移量过大
      • 3.4.1 解决方案
    • 3.3 分库分表
    • 3.4 使用专业查询的中间件 ES
  • 4. 实战慢查询
    • 4.1 首先查看是否开启了慢查询日志 slow-query-log
    • 4.2 没开启的话就开启
    • 4.3 测试慢查询
    • 4.4 查看慢查询日志
    • 4.5 explain 进行找到对应连接类型
    • 4.6 可以查看慢查询出现了多少次




1. 数据库中设置SQL慢查询

windows中是 my.ini 文件
linux和MacOs中是 my.cnf 文件
开启慢查询日志
5.5以上版本
slow_query_log=1
slow-query-log-file=/www/server/data/mysql-slow.log
long_query_time=1

2. 分析慢查询日志

直接分析慢查询日志,
mysql使用explain + sql语句进行模拟优化器来执行分析。
oracle使用explain plan for + sql语句进行模拟优化器来执行分析。

table | type | possible_keys | key |key_len | ref | rows | Extra EXPLAIN列的解释:
table 显示这一行的数据是关于哪张表的
type 这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL
rows 显示需要扫描行数
key 使用的索引
在这里插入图片描述

3. 常见的慢查询优化

是否有无使用索引,如果没有使用那必然慢,如果使用了:

3.1 索引没起作用的情况

  1. 使用了like模糊查询,查询条件中第一个字符为 “ % ” ,索引不会起作用,只有“ % ”字符不在第一个位置时才会起作用。
  2. 使用多列索引的查询语句,一个索引最多可以包含16个字段,但是只有第一个字段的时候,这个索引才会生效。

3.2 分拆关联查询

 SELECT * FROM tag 

        JOIN tag_post ON tag_id = tag.id

        JOIN post ON tag_post.post_id = post.id

        WHERE tag.tag = 'mysql';

 

        分解为:

 

        SELECT * FROM tag WHERE tag = 'mysql';

        SELECT * FROM tag_post WHERE tag_id = 1234;

        SELECT * FROM post WHERE post.id in (123,456,567);

3.4 limit偏移量过大

Mysql下 使用limit
select * from tabl limit 1000,10 0.17s
select * from tabl limit 10000,10 0.12s
select * from tabl limit 100000,10 0.97s
select * from tabl limit 1000000,10 1.66s
select * from tabl limit 10000000,10 8.56s
越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。

索引的结构(B+树)有一个特性,就是叶子节点之间依靠双向链表连接,这个特性主要是针对范围查询做的优化,因此在进行分页查询的时候,我们会直接通过链表进行查询,问题就出在了这里,由于页码过大,而且查询字段过多,每次查询时候需要回表,所以链表在遍历的时候时间过长,造成了性能瓶颈。

3.4.1 解决方案

使用索引查询id
select id from tabl limit 10000000,10 1.3s
在sql中先分页查询到id(不需回表查询速度较快),然后在进行表关联进行分页查询
select table.* from table_name as table inner join ( select id from table limit 3000000,10 ) as tmp on tmp.id=table.id;
或者直接通过主键id进行搜索数据。

3.3 分库分表

  1. 水平分表: 是将一张表的字段拆分到两张表上,从而达到单表数据存储量降低的目的。
  2. 垂直分表: 是单表数据过多后,会导致数据查询时候读盘次数增加,从而查询效率降低,这时候就考虑将数据分到多张表上。这里分拆使用分桶就行,将拆分键进行一定的算法(比如:hash运算后按照分表数取模),最终落到某张表中。

分库:一个数据库有最大连接数,如果超过了这个连接数,在高并发情况下就需要考虑分库,参考每秒查询率,QPS queries-pre-seconds。

3.4 使用专业查询的中间件 ES

如果是在查询效率提升不上去,就考虑更换查询中间件吧,使用大数据的处理方式,比如,落ElasticSearch查询。

4. 实战慢查询

4.1 首先查看是否开启了慢查询日志 slow-query-log

SHOW VARIABLES LIKE '%slow_query_log%';
在这里插入图片描述

4.2 没开启的话就开启

mysql> set global slow_query_log=1;
查看慢查询判定时间
mysql> SHOW VARIABLES LIKE 'long_query_time%';
在这里插入图片描述
修改为3秒
mysql> set global long_query_time=3;
重新连接后修改成功

4.3 测试慢查询

select sleep(4);

4.4 查看慢查询日志

在这里插入图片描述
找到了对应语句

4.5 explain 进行找到对应连接类型

在这里插入图片描述
可以看到连接类型是主键id 是最快的const类型,并且只有一行rows需要检索。

4.6 可以查看慢查询出现了多少次

mysql> show global status like '%Slow_queries%';

在这里插入图片描述






如有错误欢迎指正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

慢查询如何优化?(实战慢查询) 的相关文章

  • Hive读取文件

    hive读取文件 教会hive怎么读文本数据 这样直接读数据就是将文本文件上传到该数据表所在的hdfs的文件夹中 hadoop fs span class hljs built in put span studen dat user hiv
  • Flume实战

    前言 在一个完整的大数据处理系统中 xff0c 除了hdfs 43 mapreduce 43 hive组成分析系统的核心之外 xff0c 还需要数据采集 结果数据导出 任务调度等不可或缺的辅助系统 xff0c 而这些辅助工具在hadoop生
  • sqoop安装

    sqoop安装 作为大数据协作框架之一 xff0c Sqoop是一款用于Hadoop和关系型数据库之间进行相互的数据导入和导出的工具 安装sqoop的前提是已经具备java和hadoop的环境 1 下载并解压 最新版下载地址http ftp
  • 利用视图进行多表关联

    疑问 在Maxcompute中我们关联的码表大于8个 xff0c 然后数据存储量大于500W xff0c 那么在进行sql清洗的时候极有可能会被卡死 可是我们就是要在一张表上关联10多个表 xff0c 比如一张表中的很多字段都要关联码表 x
  • CM&CDH安装

    笔者当时自己装CM amp CDH看了不下10篇博客 xff0c 重装集群不下3次 xff0c 后来快照这个功能深深的刻在了我的心里 这篇博客笔者呕心沥血啊 不过还是会有同学会挂掉 xff0c 所以希望大家做到那里一步记得快照 发一下牢骚
  • jvm复习:主动产生fullGC

    一 jdk8参数 Xms100m Xmx100m Xmn30m XX 43 PrintGCDetails 二 代码 xff1a package cn edu tju test public class GcTest01 public sta
  • Zookeeper机制和应用场景

    Zookeeper简介 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目 xff0c 它主要是用来解决分布式应用中经常遇到的一些数据管理问题 xff0c 如 xff1a 统一命名服务 状态同步服务 集群管理 分
  • crontab定时器

    crontab定时器 linux下的定时任务 1 编辑使用crontab e 一共6列 xff0c 分别是 xff1a 分 时 日 月 周 命令 2 查看使用crontab l 3 删除任务crontab r 4 查看crontab执行日志
  • Linux后台运行程序

    在我们平常的时候运行程序的时候会产生很多的信息 xff0c 这些信息有时候有用 xff0c 有时候没用 xff0c 不过这些数据都会在该程序的log中保存 xff0c 所以把这些信息放在前台就不是很好 我们可以将脚本放在后台运行 xff0c
  • vnc的两种配置方法及解决vnc连不上的情况

    1 vnc连不上的现象 xff1a Timed out waiting for a response from the computer 解决方法 xff1a sudo sbin iptables I INPUT 1 p TCP dport
  • 【随写笔记】TouchGFX

    https www cnblogs com firege p 5805823 html https blog csdn net u013766436 article details 50805808 LTDC STM32F429系列芯片内部
  • BGP路由协议

    特点 BGP是一种外部网关协议 xff08 EGP xff09 xff0c 不擅长路由计算 xff0c 擅长路由控制 OSPF ISIS等内部网关协议 xff08 IGP xff09 xff0c 擅长路由计算 xff0c 不擅长路由控制 B
  • sed命令的使用(合并行)

    1 把所有不以句号结尾的行 xff0c 和下一行合并 span class token function sed span i span class token string 39 N s n 39 span abc txt 2 把两行合并
  • Mybatis常见面试题及答案

    文章目录 1 什么是Mybatis xff1f 2 Mybaits的优缺点 xff1a 3 和 的区别是什么 xff1f 4 通常一个mapper xml文件 xff0c 都会对应一个Dao接口 xff0c 这个Dao接口的工作原理是什么
  • HDFS排查路径

    遇到HDFS的问题 xff0c 首先需要排除可用类问题 可用类问题按影响 紧急程度不同 xff0c 可继续分为HDFS功能性受损 lt 61 HDFS高可靠性 高可用性受损 按照以下步骤进行排查 xff0c 以下任意一项有异常 xff0c
  • Docker复习: jar包打成docker

    FROM openjdk 8 ARG JAR FILE COPY springbootmybatis 1 0 SNAPSHOT jar app jar EXPOSE 9012 ENTRYPOINT 34 sh 34 34 c 34 34 j
  • iscsi磁盘挂载并设置为开机自动挂载

    前提准备 xff1a 安装iscsi客户端软件 yum y install iscsi initiator utils 第一步 xff1a 发现ISCSI设备 root 64 sdw4 iscsiadm m discovery t st p
  • 关于华为AC6507S能ping通web和ssh却登录不上排障记录(管理面隔离)

    一 客户描述PC和服务器能ping通AC但是web却登录不上 测试 xff1a 设置服务器地址为192 168 0 100 24 AC地址192 168 0 2 24 用0 100去ping0 2可以ping通 xff0c web登录连接失
  • tensor 和 numpy 的互相转换

    为什么要相互转换 xff1a 简单一句话 numpy操作多样 简单 但网络前向只能是tensor类型 各有优势 所以需要相互转换补充 convert Tensor x of torch to array y of numpy y 61 x
  • 图像畸变矫正算法实现 matlab版

    真正的相机镜头不理想 xff0c 并在图像中引入一些失真 为了解释这些非理想性 xff0c 有必要在透视投影的方程中添加失真模型 一 原图如下 xff1a 二 实现的效果图 三 算法具体实现 function undistorted img

随机推荐