iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL慢查询以及解决方案详解
  • 847
分享到

MySQL慢查询以及解决方案详解

mysql慢查询解决方案mysql慢查询mysql慢sql查询 2023-05-05 05:05:00 847人浏览 安东尼
摘要

目录一、前言二、慢查询2.1 什么是慢查询?2.2 慢查询配置1、慢查询日志2、未使用索引是否开启日志3、慢查询时间设置4、慢查询路径三、慢查询日志分析3.1 Mysqldumpslow工具四、慢查询解决方案4.1 索引

一、前言

对于生产业务系统来说,慢查询也是一种故障和风险,一旦出现故障将会造成系统不可用影响到生产业务。当有大量慢查询并且SQL执行得越慢,消耗的CPU资源或io资源也会越大,因此,要解决和避免这类故障,关注慢查询本身是关键。

二、慢查询

2.1 什么是慢查询?

慢查询,顾名思义,执行很慢的查询。当执行SQL超过long_query_time参数设定的时间阈值(默认10s)时,就被认为是慢查询,这个SQL语句就是需要优化的。慢查询被记录在慢查询日志里。慢查询日志默认是不开启的。如果需要优化SQL语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。

2.2 慢查询配置

mysql数据库为例,默认慢查询功能是关闭的,当慢查询开关打开后,并且执行的SQL语句达到参数设定的阈值后,就会触发慢查询功能打印出日志。

1、慢查询日志

查询是否开启慢查询日志:show variables like ‘slow_query_log’;

  • 开启慢查询sql:set global slow_query_log = 1/on;
  • 关闭慢查询sql:set global slow_query_log = 0/off;

如图所示已是开启状态 ON

MySQL慢查询以及解决方案详解

2、未使用索引是否开启日志

查询未使用索引是否开启记录慢查询日志: show variables like ‘log_queries_not_using_indexes’;

  • 开启记录未使用索引sql:set global log_queries_not_using_indexes=1/on
  • 关闭记录未使用索引sql:set global log_queries_not_using_indexes=0/off

如图所示是关闭状态OFF

MySQL慢查询以及解决方案详解

3、慢查询时间设置

查询超过多少秒的记录到慢查询日志中:show variables like ‘long_query_time’;

设置超X秒就记录慢查询sql:set global long_query_time= X;

如下图所示,设置的慢查询时间为0.3秒

MySQL慢查询以及解决方案详解

注:上述这些参数设置都是在当前数据库生效,当MySQL重启后则会失效。

如果要永久生效,就必须修改配置文件my.cnf

4、慢查询路径

查询MySQL慢查询日志的路径:show variables like ‘slow_query_log_file%’;

如下为查询出的路径在:/apps/log/mysql/slow3306.log

MySQL慢查询以及解决方案详解

三、慢查询日志分析

3.1 mysqldumpslow工具

以MySQL为例,一般使用mysqldumpslow工具分析慢查询日志,使用命令查询慢SQL语句。

–查询用时最多的10条慢:

sql mysqldumpslow -s t -t 10 -g 'select' /data/mysql/data/dcbi-3306/log/slow.log

得到其中一条如下图所示的结果:

MySQL慢查询以及解决方案详解

  • Count:代表这个 SQL 语句执行了多少次
  • Time:代表执行的时间,括号是累计时间
  • Lock:表示定的时间,括号是累计时间
  • Rows:表示返回的记录数,括号是累计记录数

有了这样清晰的慢查询日志分析之后,我们可以更加有针对性和更快捷的处理出现慢查询SQL语句的问题,直接找到对应程序位置优化代码从而避免慢查询出现。

四、慢查询解决方案

4.1 索引失效

之所以会出现慢查询,无疑是SQL语句的问题,一般都是扫描数据量过大、没有使用索引、索引失效等导致。如下是一些索引失效的情况:

使用LIKE关键字的查询语句

在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不会起作用。只有“%”不在第一个位置索引才会起作用。

使用多列索引的查询语句

MySQL可以为多个字段创建索引。一个索引最多可以包括16个字段。对于多列索引,只有查询条件使用了这些字段中的第一个字段时,索引才会被使用,也就是左匹配原则。

4.2 SQL语句优化

1) 查询语句应该尽量避免全表扫描,首先应该考虑在Where子句以及OrderBy子句上建立索引,但是每一条SQL语句最多只会走一条索引,而建立过多的索引会带来插入和更新时的开销,同时对于区分度不大的字段,应该尽量避免建立索引,可以在查询语句前使用explain关键字,查看SQL语句的执行计划,判断该查询语句是否使用了索引;

2)应尽量使用EXIST和NOT EXIST代替 IN和NOT IN,因为后者很有可能导致全表扫描放弃使用索引;

3)应尽量避免在Where子句中对字段进行NULL判断,因为NULL判断会导致全表扫描;

4)应尽量避免在Where子句中使用or作为连接条件,因为同样会导致全表扫描;

5)应尽量避免在Where子句中使用!=或者<>操作符,同样会导致全表扫描;

6)使用like “%abc%” 或者like “%abc” 同样也会导致全表扫描,而like “abc%”会使用索引。

7)在使用UNIOn操作符时,应该考虑是否可以使用Union ALL来代替,因为Union操作符在进行结果合并时,会对产生的结果进行排序运算,删除重复记录,对于没有该需求的应用应使用Union ALL,后者仅仅只是将结果合并返回,能大幅度提高性能;

8)应尽量避免在Where子句中使用表达式操作符,因为会导致全表扫描;

9)应尽量避免在Where子句中对字段使用函数,因为同样会导致全表扫描

10)Select语句中尽量 避免使用“*”,因为在SQL语句在解析的过程中,会将“”转换成所有列的列名,而这个工作是通过查询数据字典完成的,有一定的开销;

11)Where子句中,表连接条件应该写在其他条件之前,因为Where子句的解析是从后向前的,所以尽量把能够过滤到多数记录的限制条件放在Where子句的末尾;

12)若数据库表上存在诸如index(a,b,c)之类的联合索引,则Where子句中条件字段的出现顺序应该与索引字段的出现顺序一致,否则将无法使用该联合索引;

13)From子句中表的出现顺序同样会对SQL语句的执行性能造成影响,From子句在解析时是从后向前的,即写在末尾的表将被优先处理,应该选择记录较少的表作为基表放在后面,同时如果出现3个及3个以上的表连接查询时,应该将交叉表作为基表;

14)尽量使用>=操作符代替>操作符,例如,如下SQL语句,select dbInstanceIdentifier from DBInstance where id > 3,该语句应该替换成 select dbInstanceIdentifier from DBInstance where id >=4 ,两个语句的执行结果是一样的,但是性能却不同,后者更加 高效,因为前者在执行时,首先会去找等于3的记录,然后向前扫描,而后者直接定位到等于4的记录。

4.3 表结构优化

这里主要指如何正确的建立索引,因为不合理的索引会导致查询全表扫描,同时过多的索引会带来插入和更新的性能开销;

1)首先要明确每一条SQL语句最多只可能使用一个索引,如果出现多个可以使用的索引,系统会根据执行代价,选择一个索引执行;

2)对于Innodb表,虽然如果用户不指定主键,系统会自动生成一个主键列,但是自动产生的主键列有多个问题1. 性能不足,无法使用cache读取;2. 并发不足,系统所有无主键表,共用一个全局的Auto_Increment列。因此,InnoDB的所有表,在建表同时必须指定主键。

3)对于区分度不大的字段,不要建立索引;

4)一个字段只需建一种索引即可,无需建立了唯一索引,又建立INDEX索引。

5)对于大的文本字段或者BLOB字段,不要建立索引;

6)连接查询的连接字段应该建立索引;

7)排序字段一般要建立索引;

8)分组统计字段一般要建立索引;

9)正确使用联合索引,联合索引的第一个字段是可以被单独使用的,例如有如下联合索引index(userID,dbInstanceID),一下查询语句是可以使用该索引的,select dbInstanceIdentifier from DBInstance where userID=? ,但是语句select dbInstanceIdentifier from DBInstance where dbInstanceID=?就不可以使用该索引;

10)索引一般用于记录比较多的表,假如有表DBInstance,所有查询都有userID条件字段,目前已知该字段已经能够很好的区分记录,即每一个userID下记录数量不多,所以该表只需在userID上建立一个索引即可,即使有使用其他条件字段,由于每一个userID对应的记录数据不多,所以其他字段使用不用索引基本无影响,同时也可以避免建立过多的索引带来的插入和更新的性能开销;

五、总结

在日常写SQL和写程序的时候多关注基本的SQL语句,在业务复杂的系统中,除了上述基本的点外,尽管使用了索引,也还需要从业务本身出发,如:当查询的数量过大时,时间索引已经不满足了,可以改为分批次来查询控制数量等。

参考文章地址:

https://blog.csdn.net/LYTIT/article/details/89646408

到此这篇关于MySQL慢查询以及解决方案详解的文章就介绍到这了,更多相关MySQL慢查询解决内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL慢查询以及解决方案详解

本文链接: https://www.lsjlt.com/news/201972.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL慢查询以及解决方案详解
    目录一、前言二、慢查询2.1 什么是慢查询?2.2 慢查询配置1、慢查询日志2、未使用索引是否开启日志3、慢查询时间设置4、慢查询路径三、慢查询日志分析3.1 mysqldumpslow工具四、慢查询解决方案4.1 索引...
    99+
    2023-05-05
    mysql慢查询解决方案 mysql 慢查询 mysql 慢sql查询
  • sql慢查询解决方案
    一、慢查询产生原因 大体有以下三种可能: 1、索引没有设计好; 2、SQL 语句没写好; 3、MySQL 选错了索引。 二、慢查询解决方案 1、针对索引没有设计好的解决方案:给表重新加索引重新加索引 2、针对SQL 语...
    99+
    2023-09-01
    sql 数据库 mysql Powered by 金山文档
  • mysql查询慢的原因和解决方案
    查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 ...
    99+
    2022-10-18
  • 详解mysql跨库查询解决方案
    1.第一种跨库查询,是在同一个mysql服务器下两个不同的数据库之间的联查,关系如下图 在同一个mysql服务器下,不同的两个数据直接加上库名就可以实现跨库查询了 selec...
    99+
    2022-11-13
    mysql跨库查询
  • MySQL慢查询现象解决案例
    目录背景1.查看上述语句的执行计划2.测试模拟背景 线上慢查询日志监控,得到如下的语句:  发现:select doc_text from t_wiki_doc_text where do...
    99+
    2022-09-23
  • 详解MySQL 慢查询
    查询mysql的操作信息 show status -- 显示全部mysql操作信息 show status like "com_insert%"; -- 获得mysql的插入次数; show status l...
    99+
    2022-05-30
    MySQL 查询 MySQL 慢查询
  • Redis慢查询日志及慢查询分析详解
    目录前提介绍单线程命令的处理机制本章内容什么是慢查询慢查询日志Redis慢查询日志Redis慢查询的危害Redis客户端执行一条命令的步骤慢查询引发的问题阈值和慢查询的日志的设置阈值...
    99+
    2023-01-28
    Redis慢查询日志分析 Redis慢查询
  • 详解mysql慢日志查询
    慢日志查询作用 慢日志查询的主要功能就是,记录sql语句中超过设定的时间阈值的查询语句。例如,一条查询sql语句,我们设置的阈值为1s,当这条查询语句的执行时间超过了1s,则将被写入到慢查询配置的日志中. 慢查询主要...
    99+
    2022-05-19
    MySQL 慢日志查询 MySQL 查询
  • mysql跨库查询解决方案
    第一种跨库查询,是在同一个mysql服务器下两个不同的数据库之间的联查,关系如下图 在同一个mysql服务器下,不同的两个数据直接加上库名就可以实现跨库查询了 select * from t_test1 t1, test2.t_...
    99+
    2023-08-19
    mysql
  • MySQL慢查询以及重构查询的方式记录
    前言 什么是慢查询,如何优化慢查询,下面介绍这两个知识点的相关知识。 慢查询基础:优化数据访问 是否向数据库请求了不需要的数据 查询不需要的记录:解决方案:查询后面加上Limit...
    99+
    2022-11-12
  • Mybatis-Plus分页插件查询慢解决方案
    问题 需求反馈前端界面查询速度很慢。 分析 f12查看接口响应时间达到了5.47s。 查看后端代码逻辑,就是传了些参数,分页查询了一个列表的数据。分页插件使用的是mybatis-plus...
    99+
    2023-09-01
    mybatis mysql spring boot Powered by 金山文档
  • MySQL慢查询如何定位详解
    前言 相信大家在平时工作中都有过 SQL 优化经历,那么在优化前就必须找到慢 SQL 方可进行分析。这篇文章就介绍下如何定位到慢查询。 慢查询日志是 MySQL 内置的一项功能,可以记录执行超过指定时间的 SQL 语...
    99+
    2022-05-17
    mysql 慢查询分析 mysql慢查询定位 mysql开启慢查询
  • mysql查询速度慢如何解决
    今天小编给大家分享一下mysql查询速度慢如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2023-04-20
    mysql
  • MySQL慢查询优化解决问题
    目录1.  MySQL慢查询介绍2.发现问题(主动/被动)3.找到原因-对症下药1.  MySQL慢查询介绍   MySQL的慢查询日志是MySQL提供...
    99+
    2022-11-13
  • 网站访问慢的排查方法及解决方案
    这篇文章将为大家详细讲解有关网站访问慢的排查方法及解决方案,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。当出现网站慢的时候我们脑子中要映出几点原因: 1.程序代码执行方面2.大量数...
    99+
    2023-06-12
  • Python查询oracle数据库速度慢的解决方案
    如下所示: conn = cx_Oracle.connect('username/password@ip:port/servername') cur = conn.cursor(...
    99+
    2022-11-12
  • MySQL 中查询速度慢如何解决
    这篇文章给大家介绍MySQL 中查询速度慢如何解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、什么影响了数据库查询速度1.1 影响数据库查询速度的四个因素1.2 风险分析QPS:...
    99+
    2022-10-18
  • MySQL查询语句很慢如何解决
    今天就跟大家聊聊有关MySQL查询语句很慢如何解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。连接查询的优化无论什么数据库,多表连接的查询成本都是...
    99+
    2022-10-18
  • Oracle查看表空间使用率以及爆满解决方案详解
    目录一、查看表空间使用率1.查看数据库表空间文件:2.查看所有表空间的总容量:3.查看数据库表空间使用率4.1.查看表空间总大小、使用率、剩余空间4.2.查看表空间使用率(包含temp临时表空间)5.查看具体表的占用空间...
    99+
    2022-07-22
    oracle如何查看表空间使用率 查看表空间语句oracle oracle表空间满了
  • MySQL的索引原理以及查询优化详解
    目录一、介绍1.什么是索引?2.为什么要有索引呢?二、索引的原理一 索引原理二 磁盘IO与预读三、索引的数据结构四、Mysql索引管理一、功能二、MySQL的索引分类三、 索引的两大...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作