MySQL优化主要从其逻辑架构的
核心层
-分析、优化、执行阶段着手。
实验过程中,我是用的MySQL版本是5.7,关于MySQL的快速安装,可参考 如何在CentOS7下快速安装MySQL5.7。
MySQL调优,我们先从性能监控
开始,找点感觉。
show profile
show profile
是MySQL的查询剖析工具。
1 2 3 4 5 6 |
|
可以看到此工具默认是
OFF
(禁用)的,可以通过服务器变量在当前会话级别动态的修改
1 2 |
|
当设置完成之后,在服务器上执行的所有语句,都会测量其耗费的时间和其他一些查询执行状态变更相关的数据。
我们来创建一个表来演示一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
查询一下stu
表:
1 2 3 4 5 |
|
这个2 rows in set (0.00 sec)
就是用命令行执行一个sql后给出的提示,而且还有执行时间0.00秒。
在mysql的命令行模式下只能显示两位小数的时间,可以使用如下命令查看具体的执行时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
这样我们可以清晰地看到,Starting
、System lock
系统锁、Sending data
等等一系列操作分别用了多少时间。
通过上面的演示,我们可以看到,show profile
一执行完就给我们返回每项的执行时间,并没有显示是针对哪条sql的,其实它就是列出了最近一条你执行的sql语句的执行时间。
那一定有可以看之前执行过的多条sql语句的情况吧?是的,show profiles
show profiles
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
列出了执行过的sql语句执行时间,我们可以挑一个查询来单独看,比如我想看insert into stu(id, name) values(1, 'Pony')
这条语句的情况,可以用下面的操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
也就是说可以根据Query_ID
结合show profile
来看。
MySQL官网上,关于show profile
语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
show profile
、for query n
前面已经说过了,下面我列一下每个type
是什么意思。
all
显示所有性能信息
block io
显示块io操作的次数
context switches
显示上下文切换次数,被动和主动
cpu
显示用户cpu时间、系统cpu时间
IPC
显示发送和接受的消息数量
Memory
暂未实现
page faults
显示页错误数量
source
显示源码中的函数名称与位置
swaps
显示swap的次数
实操一下看看
1 2 3 4 5 6 |
|
我们针对Query_ID
为3的进行查看
all
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
|
查询最后的
G
的目的是格式化显示一下查询结果。这里我们可以看到,
show profile all
可以看到所有的性能信息。
block io
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
最后两列就表示块io操作的次数。
下面只把各个
type
的语法列出来,演示效果不在此赘述了。
show profile context switches for query 3
show profile cpu for query 3
show profile ipc for query 3
show profile page faults for query 3
show profile source for query 3
show profile swaps for query 3
show profile
用起来感觉很爽啊,他能帮我们看到sql语句各部分的执行时间,这对我们定位线上sql执行慢的问题很有帮助啊,but,官网上有这么一段话:
Note
The SHOW PROFILE and SHOW PROFILES statements are deprecated and will be removed in a future MySQL release. Use the Performance Schema instead;
注意
不推荐使用SHOW PROFILE和SHOW PROFILES语句,并将在以后的MySQL版本中将其删除。
改用Performance Schema;
好吧,你说删除就删除。但是在MySQL删除show profile
之前,我们还是可以用的,毕竟很香嘛。
既然后续版本会用Performance Schema
,那么我们还看下它是何方神圣吧!
MySQL的performance schema用于监控MySQL server在一个较低级别的运行过程中的资源消耗、资源等待等情况。使用performance schema可以更加容易的监控MySQL。
在MySQL的5.7版本中,性能模式是默认开启的,如果想要显式的关闭的话需要修改配置文件,不能直接进行修改,会报错Variable 'performance_schema' is a read only variable。
1 2 3 4 5 |
|
在配置文件中修改performance_schema的属性值,on表示开启,off表示关闭
1 2 |
|
看下performance_schema
数据库有哪些功能表:
1 2 |
|
一共有87张表,分别存储着相关的信息。
可以通过show create table tablename来查看创建表的时候的表结构:
1 2 |
|
我一看到threads
这个表名,还有THREAD_ID
、PROCESSLIST_ID
等等字段,就感觉这些比较重要啊有木有!
再来看一下setup_consumers
这个表:
1 2 3 4 |
|
这个consumer
总感觉似曾相识啊!
其实,想要搞明白后续的内容,我们需要理解两个基本概念:
performance_schema库下的表可以按照监视不同的纬度就行分组。
1 |
|
来,那一个事务
相关的来瞅一眼:
1 2 3 4 5 6 7 8 9 10 11 |
|
数据库刚刚初始化并启动时,并非所有instruments(事件采集项,在采集项的配置表中每一项都有一个开关字段,或为YES,或为NO)和consumers(与采集项类似,也有一个对应的事件类型保存表配置项,为YES就表示对应的表保存性能数据,为NO就表示对应的表不保存性能数据)都启用了,所以默认不会收集所有的事件。
可能你需要检测的事件并没有打开,需要进行设置,可以使用如下两个语句打开对应的instruments和consumers(行计数可能会因MySQL版本而异)。
打开等待事件
的采集器配置项开关,需要修改setup_instruments
配置表中对应的采集器配置项
1 2 3 |
|
打开等待事件
的保存表配置开关,修改setup_consumers
配置表中对应的配置项
1 2 3 |
|
当配置完成之后可以查看当前server正在做什么。
events_waits_current
表来得知,该表中每个线程只包含一行数据,用于显示每个线程的最新监视事件:释义:
1 2 3 4 5 6 7 8 9 |
|
_history
表中记录每个线程应该执行完成的事件信息,但每个线程的事件信息只会记录10条,再多就会被覆盖,(下面的演示可以看到每个线程只有10条记录)。_history_long
表中记录所有线程的事件信息,但总记录数量是10000,超过就会被覆盖掉1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
summary
表提供所有事件的汇总信息,该组中的表以不同的方式汇总事件数据(如:按用户,按主机,按线程等等)。例如:要查看哪些instruments占用最多的时间,可以通过对events_waits_summary_global_by_event_name表的COUNT_STAR或SUM_TIMER_WAIT列进行查询(这两列是对事件的记录数执行COUNT(*)、事件记录的TIMER_WAIT列执行SUM(TIMER_WAIT)统计而来)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
instance
表记录了哪些类型的对象会被检测。这些对象在被server使用时,在该表中将会产生一条事件记录。例如,file_instances表列出了文件I/O操作及其关联文件名
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
基本了解了表的相关信息之后,可以通过这些表进行实际的查询操作来进行实际的分析。
1 |
|
关于Performance Schema的东西,我们还可以参考官网继续进行详细的了解。
我们来思考一下,否可以做一个系统出来,通过查询Performance Schema
的表的一些信息,并将其展示到web端,这样我们就可以进行可视化监控了?
使用show processlist查看连接的线程个数,来观察是否有大量线程处于不正常的状态或者其他不正常的特征。
1 2 3 4 |
|
属性说明:
id
session id
user
操作的用户
host
操作的主机
db
操作的数据库
command
当前状态
- sleep:线程正在等待客户端发送新的请求
- query:线程正在执行查询或正在将结果发送给客户端
- locked:在mysql的服务层,该线程正在等待表锁
- analyzing and statistics:线程正在收集存储引擎的统计信息,并生成查询的执行计划
- Copying to tmp table:线程正在执行查询,并且将其结果集都复制到一个临时表中
- sorting result:线程正在对结果集进行排序
- sending data:线程可能在多个状态之间传送数据,或者在生成结果集或者向客户端返回数据
info
详细的sql语句
time
相应命令执行时间
state
命令执行状态
MySQL调优之性能监控:
show profile
使用show profile查询剖析工具,可以指定具体的typeperformance schema
使用performance schema来更加容易的监控mysqlshow processlist
使用show processlist查看连接的线程个数,来观察是否有大量线程处于不正常的状态或者其他不正常的特征
更多相关免费学习推荐:mysql教程(视频)
以上是初识MySQL调优之性能监控的详细内容。更多信息请关注PHP中文网其他相关文章!