mysql监控、性能调优及三范式理解

系统 1668 0

1监控

          工具: sp on mysql      sp系列可监控各种数据库

 

2调优

2.1 DB层操作与调优

               2.1.1、开启慢查询

                             在 My.cnf文件中添加如下内容(如果不知道 my.cnf的路径可使用 find / -name my.cnf进行查找):

                             在 mysqld下添加

                             Log_slow_queries = ON   作用:开启慢查询服务

                             Log-slow-queries = /var/log/slowqueries.log  作用:慢查询日志存储路径。

                             Long_query_time = 1  作用:定义慢查询时间长度,默认为 10

                             添加以上内容后使用 service mysqld restart  重启 mysql服务

                             重启后使用  show variables like ‘%slow%’查看慢查询开启状态

                             如 slow_query_log  和  log_slow_queries  两个字段的值都显示为 ON,那么说明慢查询开启成功。

               2.1.2、 mysqldumpslow分析慢查询。

                   切换到慢查询存储路径下  cd /var/log  使用  ll  命令查看文件,如果 slowqueries.log  的文件的大小变大,有内容说明已经捕捉到慢查询语句,或者使用 cat  、 more  、 less  、 vi  等命令进入文件内部进行查看,有内容说明捕捉到慢查询。

Mysqldumpslow  分析慢查询日志

                                                参数说明:

                                                         -s  排序方式  c,t,l,r  四个参数分别表示记录次数、时间、查询时间的多少和返回记录次数排序。

                                                         -t  返回前面多少条数据

                                                         -g  正则表达式匹配日志内容

 

               2.1.3、 explain执行计划进行 sql语句分析

                                      Explain分析捕捉到的 select语句

                                      用法: explain  后边直接加 select  语句。

                                                重点: type列

                                                指标说明:(从左到右,性能由差到好)

                                                                  All,index ,range,ref,,eq_ref,const or system ,null

                                                重点: extra

                                                指标说明:

                                                                  Only index  使用到了索引

                                                                  Where used  使用到了 where限制

                                                                  Using filesort  使用了全文排序

                                                                  Using temporary  使用到了临时表

                                                当 extra里显示有 using filesort  或  using temporary  时, sql的执行就会很吃力,时间就会增加。

 

               2.1.4、分析后调优,优化索引

                                      根据每个 sql语句的表现不同,在相应的字段上加索引

                                      索引一般加在 sql语句中的 where字句相关的字段上。

 

2.2Cache层的操作与调优

2.2.1开启 query cache

my.cnf里 mysqld下添加:

                              Query_cache_size = 268435456

使用的内存大小,  这个值必须是 1024的整数倍

                              Query_cache_type = 1

                              此字段值可以 0,1,2  三个值

                              0,代表关闭

                              1代表给所有的 select语句做 cache

                                        当语句 select no_no_cache * from A;执行时不做 cache

                              2代表开启 query cache功能,但只有执行

                                                 语句 select sql_cache * from A;  时才做 cache

                              Query_cache_limit = 1048576

                              单条语句的最大容量限制,超过此容量的 sql语句讲不被 cache

 

当做 cache时需注意,只有完全相同的 sql语句才被认为是相同的,此时才能够从缓存当中取数据,增加 sql执行速度。

如果 cache不合理,会导致大量的清缓存,加 cache的动作,不但不会增加 sql执行速度,反而会降低效率。如:当某表中有大量的插入,删除,修改等操作时,就不适合做 cache。

 

2.2.2query cache  运行状态分析

show status like ‘%qcache%’

                     qcache_free_blocks:数目大说明有碎片

                     qcache_free_memory:缓存中的空闲内存

                     qcache_hits:命中次数,每次查询在缓存中命中就增加

                     qcache_inserts:缓存中插入查询次数,每次插入就增加

                     qcache_lowmem_prunes:这个数字增长,表明碎片多或内存少

                     qcache_total_blocks:缓存中块的总数量

2.2.3计算

    Query_cache命中率 =query_hits/(qcache_hits+qcache_inserts)

    缓存碎片率 =qcache_free_blocks/qcache_total_blocks*100%

                     碎片率超过 20%时,可用 flush query cache整理缓存碎片

    缓存利用率 =( query_cache_size-qcache_free_memory) /query_cache_size*100%

 

2.2.4 qchche优化

         整理所有查询的 sql,讲所有需要返回结果相同以及查询方法相同的 sql整理后写成一模一样的,或使用 mybatis框架,把所有的 sql写到配置文件中,使用的时候调用。

原因是,只有一模一样的 sql语句,才会在 cache中取结果。

 

 

2.3 mysql配置优化

2.3.1 back_log

要求  MySQL  能有的连接数量。当主要 MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间 (尽管很短 )检查连接并且启动一个新线程。

back_log  值指出在 MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值  对到来的 TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。  试图设定 back_log高于你的操作系统的限制将是无效的。

当你观察你的主机进程列表,发现大量  264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL  的待连接进程时,就要加大  back_log  的值了。默认数值是 50,我把它改为 500。

2.3.2interactive_timeout

服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对  mysql_real_connect()使用  CLIENT_INTERACTIVE  选项的客户。  默认数值是 28800,我把它改为 7200。

2.3.3 key_buffer_size

索引块是缓冲的并且被所有的线程共享。 key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引 (对所有读和多重  写 ),到你  能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是 8388600(8M),我的 MySQL主机有 2GB内存,所以我把它改为  402649088(400MB)。

2.3.4 max_connections

允许的同时客户的数量。增加该值增加  mysqld  要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到  Too many connections  错误。  默认数值是 100,我把它改为 1024  。

2.3.5 record_buffer

每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是  131072(128K),我把它改为 16773120 (16M)

2.3.6 sort_buffer

每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速 ORDER BY或 GROUP BY操作。默认数值是 2097144(2M),我把它改为  16777208 (16M)。

2.3.7 table_cache

为所有线程打开表的数量。增加该值能增加 mysqld要求的文件描述符的数量。 MySQL对每个唯一打开的表需要 2个文件描述符。默认数值是 64,  我把它改为 512。

2.3.8 thread_cache_size

可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高  性能可  以这个变量值。通过比较  Connections  和  Threads_created  状态的变量,可以看到这个变量的作用。我把它设置为  80。

2.3.9 wait_timeout

服务器在关闭它之前在一个连接上等待行动的秒数。  默认数值是 28800,我把它改为 7200。

注:参数的调整可以通过修改  /etc/my.cnf  文件并重启  MySQL  实现。这是一个比较谨慎的工作,上面的结果也仅仅是我的一些看法,你可以根据你自己主机的硬件情况 (特别是内存大小 )进一步修改。

2.4  数据库设计模型

2.4.1范式设计

2.4.1.1  一范式

需要保持每一列的原子性

例:电话号码: 86-010-11111111

如果要符合一范式,那么需要把电话号码拆分为国家号码、区号、电话号码进行存储,达到每一列不能够再拆分。

符合原子性的标准即为一范式

2.4.1.2  二范式

首先必须符合一范式。

另外需要满足,每一个表必须有主键

除主键外其他的列必须和主键相关,不能只与主键的某一个部分相关

例如一个表有一个联合主键,而部分数据是与联合主键相关而不与主键相关,那么这时需要把表拆开,使得每一列都与主键相关。

 

2.4.1.3  三范式

首先必须符合二范式

另外需要满足,每一个非主键列必须直接依赖主键,而不能存在传递依赖。

 

2.4.1.4  范式设计的优点

范式设计可以避免数据冗余,减少数据库的使用空间,减轻维护数据完整性的麻烦。

2.4.1.5范式设计的缺点

 

符合范式设计的级别越高,那么拆分出来的表越多,想获得一个完整的数据的时候联合查询的时候所关联的表就越多,直接带来的问题就是性能的下降。

 

1.2.4.2反范式设计

在实际工作中,对于获得某些信息过于频繁时,我们一般采用反范式设计,这样就避免了多表的关键查询,让数据略有冗余,换来的是查询速度的提高。

mysql监控、性能调优及三范式理解


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论