原文: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. Chapter 1 Securing Your Server and Network(7):禁用SQL Server Browse

    原文:Chapter 1 Securing Your Server and Network(7):禁用SQL Server Browse 原文出处:http://blog.csdn.net/dba_h ...

  2. 【转】linux建立软链接

    实例:ln -s /home/gamestat    /gamestat linux下的软链接类似于windows下的快捷方式 ln -s a b 中的 a 就是源文件,b是链接文件名,其作用是当进入 ...

  3. 在eclipse中启动tomcat时报错:could not create java virtual machine... a fatal error...

    控制台报错:unrecoginzed option: --launcher XXMaxPermSize 解决方法:-〉 perference -> tomcat ->JVM setting ...

  4. Cocos2d-x 3.0final 终结者系列教程04-引擎架构分析

    从前,有一个跟我来Android学生,总是问我: 沉老师,为什么Android的形式被称为Activity,为什么要onCreate方法写setContentView(R.layout.main)? ...

  5. Action、Category、Data、Extras知识具体解释

    开头 Intent作为联系各Activity之间的纽带,其作用并不仅仅仅仅限于简单的数据传递.通过其自带的属性,事实上能够方便的完毕非常多较为复杂的操作.比如直接调用拨号功能.直接自己主动调用合适的程 ...

  6. How to pause the game in Uniy3D

    static float timeScale; Description The scale at which the time is passing. This can be used for slo ...

  7. Unity3D根据游戏的发展Terrain Toolkit地形生产

     今天我们继续给我Unity3D游戏开发系列.今天我们来通过Terrain Toolkit为了使地形. 虽然Unity3D它为我们提供了一个地形渲染工具,我们发现,这个地形绘制工具并不能满足我们的 ...

  8. Linux 常用命令汇总

    1.shutdown -s 时间 如果是想马上关机就直接输入0或者now: 2.init 0 这个是运行级别关机: 3.halt 这个命令不是很好用: 4.power off 这个命令也是很好用的. ...

  9. Git 少用 Pull 多用 Fetch 和 Merge(转)

    英文原文:git: fetch and merge, don’t pull This is too long and rambling, but to steal a joke from Mark T ...

  10. Java多线程之Lock的使用(转)

    package thread.lock; import java.util.concurrent.ExecutorService; import java.util.concurrent.Execut ...