一.优化SQL语句的一般步骤

1.通过 show status命令了解各种sql的执行频率

mysql客户端连接成功后,通过show[session|global] status命令,可以查看服务器的状态,如果不加默认为session(session级为当前连接的统计结果,global级为自数据库上次启动到现在的统计结果)

show status like 'Com_%';

Com_insert:执行select操作的次数,一次查询只累加1

Com_select:执行insert操作的次数,批量插入的insert操作只累加一次

Com_delete:执行update操作次数

Com_update:提交和回滚均会累加执行delete操作次数

针对innodb存储引擎的表操作,累加的算法比如

show status like 'Innodb_rows_%;

Innodb_rows_deleted :执行delete操作删除的行数

Innodb_rows_inserted:执行insert操作插入的行数

Innodb_rows_read :select查询返回的函数

Innodb_rows_updated: update操作更新的函数

可以了解到当期数据库是以插入和查询为主

对于事务型的应用,通过com_commit 和com_rollback可以了解事务提交和回滚的情况,对于回滚特别频繁的操作,可能意味着代码编写有问题

show status like ‘connections’; 试图连接mysql数据库的次数

show status like ‘uptime’; 服务器工作时间

show status like ‘slow_queries’; 慢查询的次数

2.定位执行效率较低的sql语句

可以通过以下两种方式定位执行效率较低的SQL语句

一. 通过慢查询日志定位那些执行效率较低的SQL语句

1. 查询慢查询日志的开启状态和慢查询日志储存的位置

show variables like '%query%';

slow_query_log : 是否已经开启慢查询

slow_query_log_file : 慢查询日志文件路径

long_query_time :  超过多少秒的查询就写入日志

log_queries_not_using_indexes 如果值设置为ON,则会记录所有没有利用索引的查询(性能优化时开启此项,平时不要开启)

默认情况下,MySQL数据库没有开启慢查询日志(off),需要我们手动来设置这个参数。

当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件

2. 临时开启慢查询日志,只对当前数据库有效

set global slow_query_log = on;

3.临时设置慢查询时间临界点  查询时间高于这个临界点的都会被记录到慢查询日志中

set long_query_time = 0;

4. 重启MySQL后生效

5. 在配置慢查询之前,已经导入了示例的数据文件。mysql官方数据示例,接下来就开始查询

6. 查看以上的命令操作 sudo cat -n /usr/local/mysql/data/xupengjundeMacBook-Pro-slow.log

Time
该日志记录的时间
User @Host
MySQL登录的用户和登录的主机地址
Query_time
第一个时间是查询的时间、第二个是锁表的时间、第三个是返回的行数、第四个是扫描的行数
SET timestamp
这一个是MySQL查询的时间
sql
这一行就很明显了,表示的是我们执行的sql语句

7.总结

由于我们配置long_query_time=0,因此所有的sql语句都将被记录下来,这里我们假设,仅仅是假设。我们设置的long_query_time=5,然而上面的第三项中Query_time大于5,如果是实际项目中不属于正常范围,则需要对其进行优化,当然优化的方式有很多种,下面我们使用简单的索引方式进行优化一下

二.慢查询日志在查询结束以后才记录,所以在应用反应执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态,是否锁表等,可以实时查看SQL的执行情况,同时对一些锁表操作进行优化.

3.通过explain分析低效sql的执行计划

通过以上步骤查询到效率低的SQL语句后,可以通过explain或者desc命令获取MySQL如何执行select语句的信息,包括select语句执行过程中表如何连接和连接的顺序

4.通过 show profile 分析sql

5.通过trace分析 优化器 如何选择执行计划

6.确定问题并采取相应的优化措施

MySQL优化篇(未完待续)的更多相关文章

  1. MySQL开发篇(未完待续)

    一.索引 什么是索引? 索引是帮助Mysql提高获取数据的数据结构,换一句话讲就是"排好序的快速查找的数据结构". 1.索引的分类 MySQL主要的几种索引类型:1.普通索引.2. ...

  2. VINS(九)Ceres Solver优化(未完待续)

    使用Ceres Solver库处理后端优化问题,首先系统的优化函数为

  3. [dart学习]第四篇:函数和操作符(本篇未完待续)

    接着学习dart的函数和操作符. 1.函数Function dart是一种真正的面向对象的语言,通常一个函数也是Function类型的对象,这也就是说可以把函数赋值给一个变量,或者作为另一个函数的入参 ...

  4. 一篇文章让Oracle程序猿学会MySql【未完待续】

    一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...

  5. virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)

    virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...

  6. 命令行操作mysql 未完待续......

    复制数据表 create table 新表 like 旧表: 删除表中某个字段 alter table 表名 drop column 字段; 例子: alter table news_apply_lo ...

  7. MVC丶 (未完待续······)

         希望你看了此小随 可以实现自己的MVC框架     也祝所有的程序员身体健康一切安好                                                     ...

  8. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  9. MySQL优化篇(一),我可以和面试官多聊几句吗?——SQL优化流程与优化数据库对象

    我可以和面试官多聊几句吗?只是想偷点技能过来.MySQL优化篇(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. MyISAM表锁和InnoD ...

随机推荐

  1. 图的全部实现(邻接矩阵 邻接表 BFS DFS 最小生成树 最短路径等)

    1 /** 2 * C: Dijkstra算法获取最短路径(邻接矩阵) 3 * 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> ...

  2. Error response from daemon: conflict: unable to delete a2f2e369e78e (cannot be forced) - image has dependent child images

    错误现象: Error response from daemon: conflict: unable to delete a2f2e369e78e (cannot be forced) - image ...

  3. 网络爬虫第三次作业——多线程、scrapy框架

    作业①: 1)单/多线程爬取网站图片实验   要求:指定一个网站,爬取这个网站中的所有的所有图片,例如中国气象网http://www.weather.com.cn.分别使用单线程和多线程的方式爬取. ...

  4. Centos7或RedHat7下安装Mysql

    一次简单的Mysql安装记录 前言 由于网上安装Mysql的方式有很多种,但有些方式并未安装成功,比如用Yum源,还待后续查看具体是哪一步出了问题 以rpm包的形式安装Mysql 第一步:yum in ...

  5. LWJGL3的内存管理,第一篇,基础知识

    LWJGL3的内存管理,第一篇,基础知识 为了讨论LWJGL在内存分配方面的设计,我将会分为数篇随笔分开介绍,本篇将主要介绍一些大方向的问题和一些必备的知识. 何为"绑定(binding)& ...

  6. 手把手教你使用容器服务 TKE 集群审计排查问题

    概述 有时候,集群资源莫名被删除或修改,有可能是人为误操作,也有可能是某个应用的 bug 或恶意程序调用 apiserver 接口导致,需要找出 "真凶".这时候,我们需要为集群开 ...

  7. c#连接mysql答题步骤

    引用mysql数据库 using MySql.Data.MySqlClient; 有一个mysql.dll文件 下面是实例化连接数据库 MySqlConnection Conn = new MySql ...

  8. C# 时间格式处理

    C#的常用时间格式意义: 1字符"y"---year,年,yy显示13,yyyy显示2013 2字符"M"---Month,月份,M显示5,MM显示05 3字符 ...

  9. 【Python】如何结束退出 py 脚本

    需求 当你运行脚本,在判断条件满足时,就退出脚本,结束本次执行. 方法 使用 sys.exit(),直接退出程序,但是会引发一个 SystemExit 异常: 该方法包含一个 status 参数 sy ...

  10. Python基础学习之常用模块

    1. 模块 告诉解释器到哪里查找模块的位置:比如sys.path.append('C:/python') 导入模块时:其所在目录中除源代码文件外,还新建了一个名为__pycache__ 的子目录,这个 ...