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(带函数的)

时间: 2024-09-29 13:23:14

mysql的监控及优化的相关文章

MySql:监控及优化

1.mysql的生命周期 ①MySql服务器监听3306端口 ②验证访问用户 ③创建mysql线程 ④检查内存(Qcache) ⑤解析sql ⑥生成查询计划 ⑦打开表 ⑧检查内存(Buffer Pool) ⑨到磁盘取数据 ⑩写入内存 ①①返回数据给客户端 ①②关闭表 ①③关闭线程 ①④关闭连接 2.mysql配置 linux下两种进入mysql的方式: ①设置别名 ②将mysql的/opt/lampp/bin/目录加入环境变量 ③让设置的别名永久生效 vi ~/.bashrc alias my=

性能测试之mysql监控、优化

我们在做性能测试的目的是什么,就是要测出一个系统的瓶颈在哪里,到底是哪里影响了我们系统的性能,找到问题,然后解决它.当然一个系统由很多东西一起组合到一起,应用程序.数据库.服务器.中中间件等等很多东西.那我们测试的时候上面这些东西里面任何一个环节都可能会出问题,都可能会影响我们系统的性能.这篇博客主要讲下mysql数据库咱们在做性能测试的时候应该监控什么东西,又有哪些需要优化的地方. 一.哪些东西会影响mysql的性能? 1.硬件 2.系统配置 3.数据库表结构 4.SQL以及索引 硬件 硬件就

对正在运行的mysql进行监控

对正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态. (1)QPS(每秒Query量) QPS = Questions(or Queries) / seconds mysql > show global status like "Question%"; (2)TPS(每秒事务量) TPS = (Com_commit + Com_rollback) / seconds mysql > show global status like "Com_co

101个MySQL的调节和优化的Tips

MySQL 是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思路是通用的.我已经把他们分成几类,来帮助你掌握更多MySQL的调节和优化技巧. MySQL 服务器硬件和操作系统调节: 1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中——在内存中访问文件时的速度要比在硬盘中访问时快的多.2. 不惜一切代价避免使用Swap交换分区 – 交换时是从硬盘读

100个MySQL 的调节和优化的提示

MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思路是通用的.我已经把他们分成几类,来帮助你掌握更多MySQL的调节和优化技巧. MySQL 服务器硬件和操作系统调节: 1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中——在内存中访问文件时的速度要比在硬盘中访问时快的多. 2. 不惜一切代价避免使用Swap交换分区 – 交换时是从硬盘读

腾讯云数据库团队:浅谈如何对MySQL内核进行深度优化

作者介绍:简怀兵,腾讯云数据库团队高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MySQL内核开发工作8年,具有丰富的优化经验:在分布式存储等领域有较丰富经验. MYSQL数据库适用场景广泛,相较于Oracle.DB2性价比更高,Web网站.日志系统.数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是InnoDB事务型).存在多个分支.读写效

MySQL 的调节和优化的提示

MySQL 服务器硬件和操作系统调节: 1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中——在内存中访问文件时的速度要比在硬盘中访问时快的多.2. 不惜一切代价避免使用Swap交换分区 – 交换时是从硬盘读取的,它的速度很慢.3. 使用电池供电的RAM(注:RAM即随机存储器).4. 使用高级的RAID(注:Redundant Arrays of Inexpensive Disks,即磁盘阵列) – 最好是RAID10或更高.5. 避免RAID5(注:一种存储性能.数据安全和存储成本

mysql 状态监控

运行中的mysql状态查看 对正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态. (1)QPS(每秒Query量) QPS = Questions(or Queries) / seconds mysql > show  global  status like 'Question%'; (2)TPS(每秒事务量) TPS = (Com_commit + Com_rollback) / seconds mysql > show global status like 'Com_c

101个MySQL的调节和优化技巧

MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思路是通用的.我已经把他们分成几类,来帮助你掌握更多MySQL的调节和优化技巧. MySQL 服务器硬件和操作系统调节: 1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中——在内存中访问文件时的速度要比在硬盘中访问时快的多. 2. 不惜一切代价避免使用Swap交换分区 – 交换时是从硬盘读