首页 > 数据库 >MySQL之慢查询sql排查及优化

MySQL之慢查询sql排查及优化

时间:2023-05-29 18:12:11浏览次数:45  
标签:语句 之慢 MySQL 查询 索引 sql query

前言
sql语句优化的方式:
1.尽量少 join
2.尽量少排序
3.尽量避免 select *
4.尽量少 or
5.尽量用 union all 代替 union

(优化的方式有很多,这里就不一一举例了)

当你避免这些问题的时候,为什么sql查询还是这么慢?

排查慢查询sql
ps:mysql版本为5.7

1.连接mysql

mysql -uroot -p

2.查看数据库服务慢查询日志是否开启

show variables like ‘slow_query_log’;

3.开启慢查询

set global slow_query_log=on;

4.查看慢查询阈值(超过这个时间sql就会被记录在慢查询日志中)

show variables like ‘long_query_time’;

5.设置慢查询阈值
慢查询阈值默认为10秒,为了方便测试,这里设置了0.3秒。

set long_query_time=0.3;

6.查看慢查询日志所在地址

show variables like ‘slow_query_log_file’;

7.修改慢查询日志所在地址(方便后面查找)

set global slow_query_log_file=’/usr/local/mysql/data/slow_query.log’;

8.准备测试数据
为了直观展示查询区别,准备了130万多条数据(造数据有点曲折)

9.执行查询sql

这条sql查询用时0.45秒,超过设置0.3秒,查看慢查询日志中是否有记录
10.查看慢查询日志

根据日志可看出:sql语句,查询时间,查询耗时,查询行数等信息。

小结
mysql判断sql语句是不是慢查询,是根据语句的执行时间来衡量的,mysql会用语句的执行时间和long_query_time这个系统参数做比较,如果语句执行时间大于long_query_time,都会把这个语句记录到慢查询日志里面。long_query_time的默认值是10s,一般生产环境不会设置这么大的值,一般设置1秒。

慢查询优化
找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。

1.查询sql语句执行计划
执行 EXPLAIN 命令

EXPLAIN select algorithm_id,alg_name,camera_id,status,create_time from algorithm where alg_name = ‘helmet’

为了直观展示查询结果,这里使用navicat执行sql。
主要看type那列,ALL标识全文检索,所以这条sql查询很慢。
解决:最简单有效的方法就是:加索引。

2.加索引

ALTER TABLE algorithm ADD INDEX index_alg_name ( alg_name );

加完索引后再执行一次执行计划

可以看出type是ref,已经不是全盘扫描了。
explain详解见:https://www.cnblogs.com/tufujie/p/9413852.html

重新执行查询sql

执行时间0.00秒,加了索引还是有作用的。

3.加索引前后对比

执行第一次(秒)	执行第二次(秒)	执行第三次(秒)

未加索引 0.45 0.44 0.41
加索引 0.00 0.00 0.00
加索引前后查询速度区别明显。


MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。

如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车

标签:语句,之慢,MySQL,查询,索引,sql,query
From: https://www.cnblogs.com/qianxiaoruofeng/p/17441264.html

相关文章

  • Mysql 字符集问题:utf8与utf8mb4
    UTF-8编码是一种变长的编码机制,可以用1~4个字节存储字符。MySQL中的utf8编码并不是真正的UTF-8,其最长只有3个字节。当遇到占4个字节的UTF-8编码,例如emoji字符或者复杂的汉字,会导致存储异常。从5.5.3开始,MySQL开始用utf8mb4编码来实现完整的UTF-8,其中mb4表示mo......
  • EBS: FORM窗体开发使用VIEW模式开发,plsql DEVELOPER 自动生成PLSQL脚本
    FORM窗体开发使用VIEW模式开发,plsqlDEVELOPER自动生成PLSQL脚本,CREATEORREPLACEPACKAGEAPPS.HAND_PLSQL_AUTOCREATEAUTHIDCURRENT_USERAS/*$Header:HDPLSATC.pls115.12004/09/0215:33:09pkmship$*/PROCEDUREregist_table(p_table_nameINVARCHAR2,......
  • 如何将数据从MySQL/MongoDB中迁移至云开发数据库
    本篇文章从MySQL、MongoDB迁移到云开发数据库,其他数据库迁移也都大同小异~迁移大致分为以下几步?:从MySQL、MongoDB将数据库导出为JSON或CSV格式创建一个云开发环境到云开发数据库新建一个集合在集合内导入JSON或CSV格式文件Mysql迁移到云开发数据库为了方便,我们使用Na......
  • Avalonia通过ef操作sqlite
    首选我们建个MVVM模板的项目,在项目中引入包Microsoft.EntityFrameworkCore.Sqlite1、创建实体publicclassTodoEntity{publicGuidId{get;set;}publicstringThing{get;set;}publicDateTimeCreateTime{get;set;}}2、创建上下文ubliccl......
  • 转:全面了解MSSQL锁机制以及应用
    转自:https://juejin.cn/post/68449038447243427981.锁概念及锁应用1.1锁的概念当用户并发对数据库进行操作时会带来数据不一致的问题,例如:更新丢失(两个用户读同一个数据并进行修改,一个用户破坏了另一个用户的修改结果)脏读(读出尚未提交事务的数据,产生了脏读)不可重复读(用户......
  • mysql 8 修改默认密码并修改密码策略
    1、使用默认密码登陆2、修改默认密码(必须修改默认密码)ALTERUSER'root'@'localhost'IDENTIFIEDBY'Mysql@23';3、修改默认密码策略SHOWVARIABLESLIKE'validate_password%';setglobalvalidate_password.policy=0;setglobalvalidate_password.lengt......
  • mysql之sql查询结果集小数保留
    客户要求,跟金额相关的数据,打印出来要保留两位小数,比如:13.2/13.200要显示为13.20;分析:首先查看数据库中的数据定义,均为decimal(12,2),直接通过数据库查询的结果也会保留两位小数,但是代码处理后,却会忽略掉最后一个“零”位。此处有两个解决方案:一、代码中处理,检测到为金额字......
  • 简单MySQL例子演示MVCC
    一沈秋园,满庭霜落,云烟北桥夜连城MVCC是多版本并发控制的缩写,是一种数据库和编程语言中常用的并发控制方法。它通过保存数据的历史版本,实现对数据库的高效访问。MySQL中MVCC主要是通过行记录中的隐藏字段(隐藏主键row_id,事务IDtrx_id,回滚指针roll_pointer),undo_log(版本链),Rea......
  • SQL的联合查询
    SQL的联合查询(UnionQuery)是一种将两个或多个SELECT语句的结果集合并在一起的方法。它可以将多个查询的结果合并成一个大的结果集,这个大的结果集中包含了原始查询的所有数据行。这个特性使得联合查询成为了SQL语言中非常强大和常用的功能之一。1、基本语法SELECTcolumn_name(s)......
  • 转:SqlServer锁机制与实践
    转自:https://www.cnblogs.com/wangweitr/p/7158023.html在如今这个云计算,大数据,移动互联网大行其道的时代,各种NoSQL数据库MongoDb、redis、HBase等使用的越来越广泛,大有替代关系型数据库的趋势。但是关系型数据库真的已经落伍了吗?答案是否定的。非关系型数据库不支持ACID属性,不支......