MySQL 性能优化之慢查询
性能优化的思路
- 首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句
- 其次使用explain命令去查询由问题的SQL的执行计划(脑补链接:点我直达1,点我直达2)
- 最后可以使用show profile[s] 查看由问题的SQL的性能使用情况
- 优化SQL语句
介绍
数据库查询快慢是影响项目性能的一大因素,对于数据库,我们除了要优化SQL,更重要的是得先找到需要优化的SQL语句。
MySQL数据库有一个“慢查询日志”功能,用来记录查询时间超过某个设定值的SQL,这将极大程度帮助我们快速定位到问题所在,以便对症下药。
至于查询时间的多少才算慢,每个项目、业务都有不同的要求。
比如传统企业的软件允许查询时间高于某个值,但是把这个标准方在互联网项目或者访问量大的网站上,估计就是一个Bug,甚至可能升级为一个功能缺陷。
MySQL的慢查询日志功能,默认是关闭的,需要手动开启。
开启慢查询功能
查看是否开启慢查询功能


参数说明:
- slow_query_log:是否开启慢查询,on为开启,off为关闭;
- log-slow-queries:旧版(5.6以下版本)MySQL数据库慢查询存储路径,可以不设置该参数,系统则会给一个缺省的文件:host_name-slow.log
- long_query_time:慢查询阀值,当查询时间多于设置的阀值时,记录日志,单位为秒。
临时开启满查询功能
在MySQL执行SQL语句设置,但是如果重启MySQL的话会失效。
set global slow_query_log=on;
set global long_query_time=1;
永久性开启慢查询
修改:/etc/my.cnf,添加以下内容,然后重启MySQL服务
[mysqld]
lower_case_table_names=1
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/chenyanbindeMacBook-Pro-slow.log
long_query_time=1

查看满查询启动状态

演示慢查询
为了演示方便,我们让sql睡眠3秒!


格式说明:
- 第一行,SQL查询执行的具体时间
- 第二行,执行SQL查询的连接信息,用户和连接IP
- 第三行,记录了一些我们比较有用的信息,
- Query_timme,这条SQL执行的时间,越长则越慢
- Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
- Rows_sent,查询返回的行数
- Rows_examined,查询检查的行数,越长就越浪费时间
 
- 第四行,设置时间戳,没有实际意义,只是和第一行对应执行时间。
- 第五行,执行的SQL语句记录信息
分析满查询日志
MySQL自带的mysqldumpslow

参数说明:
- -s, 是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙;
- -t, 是top n的意思,即为返回前面多少条的数据;
- -g, 后边可以写一个正则匹配模式,大小写不敏感的;
MySQL性能fenix语句show profile(重要)
介绍
- Query Profiler是MySQL自带的一种query诊断分析工具,通过它可以分析出一条SQL语句性能瓶颈在什么地方。
- 通常使用explain,以及slow query log都无法做到精确分析,但是Query profiler却可以定位出一条SQL执行的各种资源消耗情况,比如CPU、IO等,以及该SQL执行所耗费的时间等。不过该工具只有在MySQL5.0.37以上版本中才有实现
- 默认的情况下,MySQL的该功能没有打开,需要自己手动打开
语句使用
- show profile和show profiles语句可以展示当前会话(退出session后,profiling重置为0)中执行语句的资源使用情况。
- show profiles:以列表形式显示最近发送到服务器上执行的语句的资源使用情况,显示的记录数由变量:profiling_history_size控制,默认15条
- show profile:只是最近一条语句执行的消息资源占用信息,默认实现Status和Duration两列
开启Profile功能
- Profile功能由MySQL会话变量:profiling控制,默认是OFF关闭状态。
- 查看是否开启了Profile功能
select @@profiling; show variables like '%profil%';

打开profiling功能
set profiling=1;

show profile用法
SHOW PROFILE [type [, type] …… ] [FOR QUERY n] [LIMIT row_count [OFFSET offset]]
type: { ALL | BLOCK IO | CONTEXT SWITCHES | CPU | IPC | MEMORY | PAGE FAULTS | SOURCE | SWAPS }

MySQL 性能优化之慢查询的更多相关文章
- Mysql - 性能优化之子查询
		记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ... 
- mysql性能优化-慢查询分析、优化索引和配置 (慢查询日志,explain,profile)
		mysql性能优化-慢查询分析.优化索引和配置 (慢查询日志,explain,profile) 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 ... 
- Mysql性能优化三(分表、增量备份、还原)
		接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ... 
- [MySQL性能优化系列]提高缓存命中率
		1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ... 
- [MySQL性能优化系列]巧用索引
		1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ... 
- MySQL性能优化:索引
		MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ... 
- mysql 性能优化方向
		国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ... 
- MySQL性能优化总结
		一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ... 
- MYSQL性能优化的最佳20+条经验
		MYSQL性能优化的最佳20+条经验 2009年11月27日 陈皓 评论 148 条评论 131,702 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数 ... 
随机推荐
- python 读取txt文件
			1.打开文件 #1)1 f = open("test.txt","r") #设置文件对象 f.close() #关闭文件 #2) #为了方便,避免忘记close ... 
- WPF之数据绑定Data Binding
			一般情况下,应用程序会有三层结构:数据存储层,数据处理层(业务逻辑层),数据展示层(UI界面). WPF是“数据驱动UI”. Binding实现(通过纯C#代码) Binding分为source和ta ... 
- SD.Team主题形象小人偶
			W e ♥ S D ♫ ♪ 咔咔咔~可能源码冲突会造成小人偶光头 :) 
- Java IO(八) PipedInputStream 和 PipedOutputStream
			Java IO(八) PipedInputStream 和 PipedOutputStream 一.介绍 PipedInputStream 和 PipedOutputStream 是管道输入流和管道输 ... 
- pandas DataFrame 的横向纵向拼接组合
			concat 与其说是连接,更准确的说是拼接.就是把两个表直接合在一起.于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis . 函数的具体参数是: concat( ... 
- 7z命令行简单使用
			7z命令行简单使用 网上有很多博客都有记录7z的命令行使用方式,但看起来乱起八糟的,不知所云. 急于使用者可以直接看实例 注:我仅仅记录我认为常用的命令,毕竟没有那么多的精力去学习不常用的东西. 简介 ... 
- 50个SQL语句(MySQL版) 问题十一
			--------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ... 
- HTML、CSS与JS实现简易iPhone计算器
			效果如图 源码,通俗易懂 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ... 
- 我的web课堂作业
			001 my first page <%@ page language="java" contentType="text/html; charset=UTF-8&q ... 
- 使用turtle库绘制奥运五环
			import turtle as t t.setup(600,600,50,50) t.pensize(3) t.pencolor("red") t.penup() t.pendo ... 
