一.优化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. SpringBoot第一集:入门(2020最新最易懂)

    2020最新SpringBoot第一集:入门(2020最新最易懂) 学习思路: 是什么?为什么要学,有什么用?有什么特点?简单明了的总结一句话! SpringBoot推荐开发工具: Spring To ...

  2. 校招“避雷针”——GitHub 热点速览 Vol.43

    作者:HelloGitHub-小鱼干 如果要选一个关键词来概述本周的 GitHub Trending,保护 便是不二之选.先是有 ShameCom 来为应届毕业生护航,让学弟学妹们不被黑名单上的公司上 ...

  3. js 小数点失精度

    解决方法思路:将小数化成整数后再作运算.具体代码如下:  /*** 加法运算,避免数据相加小数点后产生多位数和计算精度损失.** @param num1加数1 | num2加数2*/function ...

  4. Setuptools 【Python工具包详解】

    什么是setuptools setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的.用户在使用setuptools创建 ...

  5. NB-IOT覆盖范围有多大 NB-IOT的强覆盖是怎么实现的

    NB-IoT技术自出现以来就以其强大的覆盖范围和通讯距离长而受到广泛的欢迎,发展到现在已经成为万物互联网络中的一个重要分支.那么NB-IoT覆盖范围到底有多大,是怎么来衡量其覆盖能力? 强大的覆盖范围 ...

  6. php socket通信的简单实现

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  7. 容器之间通讯方式\与pod关系

    1.概述 k8s里面容器是存在于pod里面的,所以容器之间通讯,一般分为三种类型:1. pod内部容器之间 2. pod 与 pod 容器之间 3. pod 访问service服务 (1) pod内部 ...

  8. Java中final修饰的方法是否可以被重写

    这是一次阿里面试里被问到的题目,在我的印象中,final修饰的方法是不能被子类重写的.如果在子类中重写final修饰的方法,在编译阶段就会提示Error.但是回答的时候还是有点心虚的,因为final变 ...

  9. Spark: JAVA_HOME is not set

    在Spark项目,sbin目录下的spark-config.sh文件下,最后添加JAVA_HOME的索引. 即可.

  10. VUE自定义(有限)库存日历插件

    开发过程中遇到一个令人发指的,一个element-ui无法满足的日历需求, 改造其日历插件的代价太大,于是索性自己手写一个,需求如下: 1. 根据开始.结束时间计算时间覆盖的月份,渲染有限的可选择日期 ...