首页 > 代码库 > mysql的监控及优化

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的监控及优化