mysql的监控及优化
Posted 轻微强迫症
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql的监控及优化相关的知识,希望对你有一定的参考价值。
---恢复内容开始---
1.数据库的用途:写数据和读数据
2.查询语句的生命周期:
(1)mysql服务器监听3306端口(2)验证访问用户(3)创建mysql线程
(4)检查内存(Qcache)
(5)解析SQL(6)生成查询计划(7)打开表
(8)检查内存(Buffer Pool)
(9)到磁盘取数据(10)写入内存(11)返回数据给客户端(12)关闭表(13)关闭线程(14)关闭连接
3.mysql构架
总的来说,MySQL Server可以看成是二层架构,第一层我们通常叫做 SQL Layer,在 MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql 解析,执行计划优化,query cache 的处理等等;第二层就是存储引擎层,我们通常叫做 Storage Engine Layer,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。
由mysql连接器(mysql客户端、各种编程语言接口等)、mysq连接池、mysql查询优化器、存储引擎层(InnoDB等)、文件系统(file&logs)和mysql服务器组成
(1)mysql连接数:默认最大连接数是100,连接数少的话,在大并发下连接数会不够用,会有很多线程在等待其他连接释放,就可能会导致数据库连接超时或者响应时间过长,所以需要调整最大连接数。
(2)设置mysql的最大连接数
在linux中的最大连接数的配置文件/etc/my.cnf中或者cd/opt/lappp/etc/my.cnf中修改或者增加[mysqld]下面内容
最大连接数:max_connections=1000;
超时时间:wait_timeout=10
查看当前有多少个连接:show status like ‘%Threads_connected%‘;或者show processlist;
4.缓存的两个维度
(1)缓存1(mysql层):查询缓存Query Cache
查询sql的生命周期到达检查内存环节的时候,当查询命中缓存,mysql会立刻返回结果,跳过解析、优化和执行阶段。查询缓存会跟踪系统中的每张表,如果这些表发生变化,那么和这张表相关的所有查询缓存全部失效。
在查询缓存的时候,mysql不会对sql进行任何处理,它精确的使用客户端传来的查询,只要字符大小写,或者注释有一点点的不同,查询缓存就认为是不同的,任何一个包含不确定的函数,比如:now(),current_date()的查询不会被缓存。
开启查询缓存对于读写都增加了额外的开销,对于读在查询开始前需要先检查缓存;对于写,在写入后需要更新缓存(失效)。
(1.1)配置查询缓存:linux下为my.cnf,windows下为my.ini
是否开启查询缓存:query_cache_type=on/off
分配给查询缓存的总内存,一般建议不超过256M:query_cache_size=200M
限制存储的最大结果,如果查询结果超出,就不会缓存:query_cache_limit=1M
查询缓存状态:show variables like ‘%query_cache%‘;
监控qcache当前使用情况:show status like ‘%Qcache%‘;查询出来的第一项如果数值过大,可以使用flush query cache;语句来清理查询缓存碎片,提高内存使用性能。
缓存的命中率=Qcache hits/(Qcache_hits+Qcache_inserts);
(2)缓存2(存储引擎层)InnoDB_Buffer_Pool
buffer pool是innodb存储引擎带的一个缓存池,如果内存中存在的话,直接返回,提交查询响应时间
innodb buffer pool 和qcache的区别:qcache缓存的是sql语句和对应该语句的结果集,buffer pool中缓存的是表中的数据,如果表中数据有变化,那么qcache中是查询不到的,因为表更改后,在查询改sql,在qcache中失效;bufferpool不会,因为它存的是表中的数据;bufferpool设置的越大越好,一般设置为服务器物理内存的70%
(2.1)配置
bp大小:innodb_buffer_pool_size=20M
如果开启改参数,停止mysql服务时,innodb将innodb缓冲池中的热数据保存到本地硬盘:innodb_buffer_pool_dump_now=ON,
如果开启,启动mysql服务时,mysql将本地热数据加载到innodb缓存池中:innodb_buffer_pool_load_at_startup=OFF,
查看ibp的状态:show variables like ‘%innodb_buffer_pool%‘;
监控innodb_buffer_pool的使用情况:show status like ‘%innodb_buffer_pool%‘;
主要注意innodb_buffer_pool_read_requests和innodb_buffer_pool_reads,通过这两个获得bp的命中率
5.mysql慢查询日志:
(1)mysqlslowdump,用来帮助数据库管理人员解决可能存在的性能问题
(2)配置文件:在my.cnf中增加:log-slow-queries=/opt/data/slowquery.log(指定日志文件的存放位置,可以为空,系统会给一个缺省文件host_name-slow.log)
记录超过的时间:long_query_time=2,默认为10s
(3)执行命令:set global slow query log=on;
设置记录查询超过多长时间sql:set global long query time=1;
日志路径:set global slow query log file=‘%/opt/data/slow_query.log%‘;
查询慢查询状态:show variables like ‘%query%‘;
(4)mysqldumpslow命令介绍:mysqldumpslow -s t -t 20 -g ‘select‘ 路径
-s:按照何种方式排序,c\t\l\t分别是按照记录次数、时间、查询时间、返回的记录数来排序,前面加上a表示相应的倒叙,-t:是top n的意思,返回前面多少条数据;-g:后边可以写一个正则匹配模式,大小写不敏感。
6.mysql profile:分析sql执行带来的开销是优化sql的重要手段,诸如IO,上下文切换,cpu,memory等
(1)配置
开启profile:set @@profiling=1;
查看profile是否开启:select @@profiling;1为开启,0为关闭,开启后只对当前的session有效
查看被记录的sql:show profiles;或者show profiles for query n:查看指定的sql
show profile cpu/block io/memory for query 1;
7.sql优化目标
(1)减少IO次数
(2)降低cpu计算:order by,group by,distinct,最大数、最小数等,都是消耗cpu的大户
(3)优化方法:改变sql的执行计划,sql优化的基本原则:
(3.1)尽量少join
(3.2)尽量少排序:减少排序的方法:通过利用索引来排序、减少参与排序的记录条数、非必要不对数据进行排序
(3.3)尽量避免select *
(3.4)尽量用join代替子查询
(3.5)尽量用union all代替union
(3.6)禁用外键
(3.7)避免大sql、保持事物的简短精悍、避免大批量更新、避免类型转换、避免取过量数据,建议使用limit、避免sql中进行数学运算、函数计算、逻辑判断等、避免or(同一字段推荐in不同字段推荐union)
总结:1.避免磁盘io,尽量让查询在内存中完成2.通过sql和索引的调整,让mysql用跟高效率的方式查询
4.索引设计原则
下面这两种方式都是添加普通索引
create index ‘my_index‘ on bkl(name);
alter table blk add index my_index2 (sex);
删除索引:
alter table blk drop index my_index2;
(1)最适合索引的列是出现在where子句中的列,或者连接子句中指定的列
(2)使用唯一索引
(3)使用短索引
(4)利用最左前缀
(5)不要过度索引
---恢复内容结束---
1.数据库的用途:写数据和读数据
2.查询语句的生命周期:
(1)mysql服务器监听3306端口(2)验证访问用户(3)创建mysql线程
(4)检查内存(Qcache)
(5)解析SQL(6)生成查询计划(7)打开表
(8)检查内存(Buffer Pool)
(9)到磁盘取数据(10)写入内存(11)返回数据给客户端(12)关闭表(13)关闭线程(14)关闭连接
3.mysql构架
总的来说,MySQL Server可以看成是二层架构,第一层我们通常叫做 SQL Layer,在 MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql 解析,执行计划优化,query cache 的处理等等;第二层就是存储引擎层,我们通常叫做 Storage Engine Layer,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。
由mysql连接器(mysql客户端、各种编程语言接口等)、mysq连接池、mysql查询优化器、存储引擎层(InnoDB等)、文件系统(file&logs)和mysql服务器组成
(1)mysql连接数:默认最大连接数是100,连接数少的话,在大并发下连接数会不够用,会有很多线程在等待其他连接释放,就可能会导致数据库连接超时或者响应时间过长,所以需要调整最大连接数。
(2)设置mysql的最大连接数
在linux中的最大连接数的配置文件/etc/my.cnf中或者cd/opt/lappp/etc/my.cnf中修改或者增加[mysqld]下面内容
最大连接数:max_connections=1000;
超时时间:wait_timeout=10
查看当前有多少个连接:show status like ‘%Threads_connected%‘;或者show processlist;
4.缓存的两个维度
(1)缓存1(mysql层):查询缓存Query Cache
查询sql的生命周期到达检查内存环节的时候,当查询命中缓存,mysql会立刻返回结果,跳过解析、优化和执行阶段。查询缓存会跟踪系统中的每张表,如果这些表发生变化,那么和这张表相关的所有查询缓存全部失效。
在查询缓存的时候,mysql不会对sql进行任何处理,它精确的使用客户端传来的查询,只要字符大小写,或者注释有一点点的不同,查询缓存就认为是不同的,任何一个包含不确定的函数,比如:now(),current_date()的查询不会被缓存。
开启查询缓存对于读写都增加了额外的开销,对于读在查询开始前需要先检查缓存;对于写,在写入后需要更新缓存(失效)。
(1.1)配置查询缓存:linux下为my.cnf,windows下为my.ini
是否开启查询缓存:query_cache_type=on/off
分配给查询缓存的总内存,一般建议不超过256M:query_cache_size=200M
限制存储的最大结果,如果查询结果超出,就不会缓存:query_cache_limit=1M
查询缓存状态:show variables like ‘%query_cache%‘;
监控qcache当前使用情况:show status like ‘%Qcache%‘;查询出来的第一项如果数值过大,可以使用flush query cache;语句来清理查询缓存碎片,提高内存使用性能。
缓存的命中率=Qcache hits/(Qcache_hits+Qcache_inserts);
(2)缓存2(存储引擎层)InnoDB_Buffer_Pool
buffer pool是innodb存储引擎带的一个缓存池,如果内存中存在的话,直接返回,提交查询响应时间
innodb buffer pool 和qcache的区别:qcache缓存的是sql语句和对应该语句的结果集,buffer pool中缓存的是表中的数据,如果表中数据有变化,那么qcache中是查询不到的,因为表更改后,在查询改sql,在qcache中失效;bufferpool不会,因为它存的是表中的数据;bufferpool设置的越大越好,一般设置为服务器物理内存的70%
(2.1)配置
bp大小:innodb_buffer_pool_size=20M
如果开启改参数,停止mysql服务时,innodb将innodb缓冲池中的热数据保存到本地硬盘:innodb_buffer_pool_dump_now=ON,
如果开启,启动mysql服务时,mysql将本地热数据加载到innodb缓存池中:innodb_buffer_pool_load_at_startup=OFF,
查看ibp的状态:show variables like ‘%innodb_buffer_pool%‘;
监控innodb_buffer_pool的使用情况:show status like ‘%innodb_buffer_pool%‘;
主要注意innodb_buffer_pool_read_requests和innodb_buffer_pool_reads,通过这两个获得bp的命中率
5.mysql慢查询日志:
(1)mysqlslowdump,用来帮助数据库管理人员解决可能存在的性能问题
(2)配置文件:在my.cnf中增加:log-slow-queries=/opt/data/slowquery.log(指定日志文件的存放位置,可以为空,系统会给一个缺省文件host_name-slow.log)
记录超过的时间:long_query_time=2,默认为10s
(3)执行命令:set global slow query log=on;
设置记录查询超过多长时间sql:set global long query time=1;
日志路径:set global slow query log file=‘%/opt/data/slow_query.log%‘;
查询慢查询状态:show variables like ‘%query%‘;
(4)mysqldumpslow命令介绍:mysqldumpslow -s t -t 20 -g ‘select‘ 路径
-s:按照何种方式排序,c\t\l\t分别是按照记录次数、时间、查询时间、返回的记录数来排序,前面加上a表示相应的倒叙,-t:是top n的意思,返回前面多少条数据;-g:后边可以写一个正则匹配模式,大小写不敏感。
6.mysql profile:分析sql执行带来的开销是优化sql的重要手段,诸如IO,上下文切换,cpu,memory等
(1)配置
开启profile:set @@profiling=1;
查看profile是否开启:select @@profiling;1为开启,0为关闭,开启后只对当前的session有效
查看被记录的sql:show profiles;或者show profiles for query n:查看指定的sql
show profile cpu/block io/memory for query 1;
7.sql优化目标
(1)减少IO次数
(2)降低cpu计算:order by,group by,distinct,最大数、最小数等,都是消耗cpu的大户
(3)优化方法:改变sql的执行计划,sql优化的基本原则:
(3.1)尽量少join
(3.2)尽量少排序:减少排序的方法:通过利用索引来排序、减少参与排序的记录条数、非必要不对数据进行排序
(3.3)尽量避免select *
(3.4)尽量用join代替子查询
(3.5)尽量用union all代替union
(3.6)禁用外键
(3.7)避免大sql、保持事物的简短精悍、避免大批量更新、避免类型转换、避免取过量数据,建议使用limit、避免sql中进行数学运算、函数计算、逻辑判断等、避免or(同一字段推荐in不同字段推荐union)
总结:1.避免磁盘io,尽量让查询在内存中完成2.通过sql和索引的调整,让mysql用跟高效率的方式查询
4.索引设计原则
下面这两种方式都是添加普通索引
create index ‘my_index‘ on bkl(name);
alter table blk add index my_index2 (sex);
删除索引:
alter table blk drop index my_index2;
(1)最适合索引的列是出现在where子句中的列,或者连接子句中指定的列
(2)使用唯一索引
(3)使用短索引
(4)利用最左前缀
(5)不要过度索引
5.事务:把多件事情当做一件事情来处理,例如:转账,我把钱转出去,别人收到我转出去的钱,如果我在转出的时候断网了,那么要么都成功,要么都失败
6.什么是锁
锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问,一方面最大程度的提供并发访问,量一方面要确保每个用户能以一致性得方式读取和修改数据。
Innodb存储引擎会在行级别上对表数据加锁。
(1)关闭自动提交
查看自动提交是否开启:select @@autocommit;0为关闭,1为开启
设置自动提交关闭:set @@autocommit=0;只对当前session有效
修改配置文件my.cnf中[mysqld]模块下加入autocommit =0;永久生效
(2)特点:Innodb是通过对索引上的索引项加锁来实现行锁。如果不是索引的话,实现的是表锁
(3)操作,分别打开两个终端,做update操作不同的行,不提交的时候,在第二个终端出现被锁状态,实现表锁;如果是索引,分别打开两个终端,做update操作相同的行,不提交的时候,在第二个终端出现被锁状态,实现行锁。
(4)查看死锁:show engine innodb status\G;
7.explain:该命令是查看查询优化器如果决定执行查询的主要方法,这个功能有局限性,只是一个近似结果,有时它是一个很好的近似,有时可能相差甚远。
(1)explain select * from students where id =2;
(2)all(全表扫描)<index(索引)<range(范围扫描)<ref(非唯一性索引扫描)<eq_ref(主键或者唯一索引)<const,system(??)<null(带函数的)
以上是关于mysql的监控及优化的主要内容,如果未能解决你的问题,请参考以下文章