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

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监控、性能调优及三范式理解的更多相关文章

  1. MySQL 数据库性能调优

    MySQL 数据库性能调优 MySQL性能 最大数据量 最大并发数 优化的范围有哪些 存储.主机和操作系统方面: 应用程序方面: 数据库优化方面: 优化维度 数据库优化维度有四个: 优化选择: 数据库 ...

  2. [Spark性能调优] 第三章 : Spark 2.1.0 中 Sort-Based Shuffle 产生的内幕

    本課主題 Sorted-Based Shuffle 的诞生和介绍 Shuffle 中六大令人费解的问题 Sorted-Based Shuffle 的排序和源码鉴赏 Shuffle 在运行时的内存管理 ...

  3. mysql数据库性能调优总结积累

    mysql数据库的调优大概可以分为四大块 0 架构调优 ---根据业务 读写分库分表   ---主从 读写分离 1 配置的调优 ---开启缓存查询  设置缓存大小 ---最大连接数设置 ---数据库引 ...

  4. 十八般武艺玩转GaussDB(DWS)性能调优(三):好味道表定义

    摘要:表结构设计是数据库建模的一个关键环节,表定义好坏直接决定了集群的有效容量以及业务查询性能,本文从产品架构.功能实现以及业务特征的角度阐述在GaussDB(DWS)的中表定义时需要关注的一些关键因 ...

  5. JBoss AS 7性能调优(三)

    原文:http://www.mastertheboss.com/jboss-performance/jboss-as-7-performance-tuning/page-4 调优Webserver线程 ...

  6. MySQL的性能调优工具:比mysqlreport更方便的tuning-primer.sh

    年初的时候收藏过一篇关于mysqlreport的报表解读,和内置的show status,和show variables相比mysqlreport输出一个可读性更好的报表:但Sundry MySQL提 ...

  7. mysql监控以及调优

    mysql 优点: 简单易用,成本低,易扩展,复制功能领先 mysql的生命周期: Mysql服务器监听3306端口>验证访问用户>创建mysql线程>检查内存(Qcache)> ...

  8. MYSQL数据库性能调优之四:解决慢查询--索引

    为什么索引能够提高查询速度?没有索引 检索数据的方式是从头到尾一条一条挨着匹配,这是慢的根本原因:索引类型BTREE:二叉树类型,原理图如下:对表创建一个二叉树,记录中间数据的物理磁盘地址,二叉树检索 ...

  9. MYSQL数据库性能调优之八:mysql日志

    MySQL日志 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志.中继日志: 使用 SHOW GLOBAL VARIABLES LIKE '%log%';  查询所有日志配置详情: 一. ...

随机推荐

  1. Android使用HttpURLConnection下载图片

    讲到http就必须要了解URI和URL URI (uniform resource identifier)统一资源标志符: URL(uniform resource location )统一资源定位符 ...

  2. 看你的门-攻击服务器(4)-HTTP参数注入攻击

    首先需要声明.这纯粹是没有远见和有点真才实学开发一个愚蠢的观点,只为web参考系统安全. 1.HTTP参数注入攻击 參数,被用做后端HTTP请求中的參数,这个时候就有可能会导致HTTP參数注入. 一个 ...

  3. 网络爬虫WebCrawler(1)-Http网页内容抓取

    在windows在下面C++由Http协议抓取网页的内容: 首先介绍了两个重要的包(平时linux在开源包,在windows下一个被称为动态链接库dll):curl包和pthreads_dll,其中c ...

  4. Kinect开发笔记之二Kinect for Windows 2.0新功能

    这是本博客翻译文档的第一篇文章.笔者已经苦逼的竭尽全力的在翻译了.但无奈英语水平也是非常有限.不正确或者不妥当不准确的地方必定会有,还恳请大家留言或者邮件我以批评指正.我会虚心接受. 谢谢大家.   ...

  5. boostrap-非常好用但是容易让人忽略的地方------modal

    使用bootstrap框架好久了,在开发中也用到了或者遇到了很多的问题,所以跟大家分享一下 bootstrap modal 组件的样式 .modal-lg .modal-sm 说明:这个是bootst ...

  6. Bye,IE!服务互联网20年IE终于要退役了

    美国当地时间16日中午,Microsoft Edge官微发表了祝词:Internet Explorer 20岁生日快乐!你在过去做出了巨大贡献,今后由我继续发扬光大.服务互联网20年之后,IE终于要退 ...

  7. hdu 5045 Contest(状态压缩DP)

    题解:我们使用一个二位数组dp[i][j]记录进行到第i个任务时,人组合为j时的最大和(这里的j我们用二进制的每位相应一个人). 详细见代码: #include <iostream> #i ...

  8. 房费制VB版本(一个)——系统分析

          首先.我们先回答两个个问题:         1.机房收费系统"是什么"?         2.机房收费系统应该"干什么"?        我的回答 ...

  9. VS路宏 vc++于OutDir、ProjectDir、SolutionDir不同的路径

    说明 $(RemoteMachine) 设置为"调试"属性页上"远程计算机"属性的值.有关很多其它信息,请參见更改用于 C/C++ 调试配置的项目设置. $(R ...

  10. JavaScript面向对象旅程(下)

    JavaScript面向对象旅程 剪不断,理还乱,是离愁. 前面已经提到过新语言开发的两个步骤,分别是:一.定义基本的数据类型,完善结构化编程语言的设计:二.为函数类型绑定this的概念,好在对象的方 ...