性能测试之mysql监控、优化

咱们在作性能测试的目的是什么,就是要测出一个系统的瓶颈在哪里,究竟是哪里影响了咱们系统的性能,找到问题,而后解决它。固然一个系统由不少东西一块儿组合到一块儿,应用程序、数据库、服务器、中中间件等等不少东西。那咱们测试的时候上面这些东西里面任何一个环节均可能会出问题,均可能会影响咱们系统的性能。这篇博客主要讲下mysql数据库我们在作性能测试的时候应该监控什么东西,又有哪些须要优化的地方。mysql

1、哪些东西会影响mysql的性能?

  • 1.硬件
  • 2.系统配置
  • 3.数据库表结构
  • 4.SQL以及索引

硬件

硬件就指的是数据库服务器的配置,服务器说白了就是一台电脑而已,若是电脑的配置高,cpu处理能力强,内存大,硬盘是ssd的,那确定性能好。固然这种方式成本也是最高的,要花钱的嘛。linux

系统配置

系统配置一个指的是操做系统的配置,有一些操做系统的配置会影响mysql的性能,如今我们大多数服务器都是用的linux服务器,linux上面一切东西都是基于文件的,mysql数据里面的表、数据等等都是文件存在磁盘上的。sql

linux系统有一个系统配置是文件打开的数量,默认是1024,也就是最多只能打开1024个文件,那在数据库里面表比较多、并发大的状况下,这1024就不够用了,要想获取数据就得打开文件,可是打开文件的数量最多就1024个,就会致使有一些数据获取不到,就得等待别的文件关闭以后,才能打开。那就要修改系统的配置,在/etc/security/limits.conf文件里面能够修改最大打开文件的数量。数据库

还有一些mysql配置参数会影响mysql的性能。sublime-text

sleep超时时间

mysql的链接数是提早配置好的,若是程序里面代码写的很差,有一些数据库操做没有及时关闭数据库,那这个连接就不会释放会一直占用连接,这样子并发大的状况下,就会致使数据库链接数不够用了,就链接不上数据库了。mysql默认8小时不操做数据库才会自动关闭连接,因此这个sleep的超时时间会影响mysql的性能。缓存

 

独立表空间设置
表空间是什么呢,就是每一个表存放数据的地方。
举个例子,一个仓库,你要往仓库里面放东西的话,你来一些东西你就随便扔到里面,这样东西一多,你要找到一个东西就很难找了。那怎么办呢,我在仓库里面放几个货架,每一个货架放同一个种类的东西,这样的话,找一个东西就很方便了。
表空间呢就和这个货架差很少,每一个表我单独管理的话,那找数据就比较方便了。
 
mysql5.6.6以前默认是共享的表空间,mysql5.6.6以后默认是开启了独立表空间的。
那什么是共享表空间呢?
就是说这个空间是全部的表都共享的,全部的表的数据都存在一个地方的。
 
你想一下,全部的货架都存在一个仓库里面的话,快递员去拿货的时候,人一多,可能进出都要排队,拿货的时候就比较慢了。
因此说共享表空间若是在数据量和并发量比较大的状况下,对IO的消耗是比较大的,影响性能。
 
共享表空间还有一个缺点就是不能自动收缩,自动收缩是什么意思呢,刚建表的时候,表里面数据不多,就1条数据,可能占用空间就几kb,到后来数据多了,占用了10个G的空间,而后发现有一些数据都是垃圾数据,删了5个G,那这个时候表空间就不会自动减少了,它仍是10个G,浪费空间。
 
而独立表空间就是每一个表的表空间都是独享的,用仓库这个例子就是每一个货架都单独在一个房间里头,这样的话快递员去拿哪一个东西,直接去那个房间里就行了,不用都挤在一个仓库里了。
 
而使用了独立的表空间,每一个表都有本身的表空间,删了数据也会自动收缩,就不会有上面的问题了。
 

 

 

 

读/写进程数配置

在mysql5.5以后读、写的进程数是能够配置的。默认读和写的进程数都是4个。服务器

固然咱们都知道,人多好干活嘛。进程多就是干活的人多,具体配置根据cpu的核数和业务逻辑来配置这两个值。架构

假如cpu是32核的,那么就是同时能够有32个进程在运行,就能够把这两个值给调大。并发

假如说是系统是一个内容类的网站,大多数操做都是读操做,那么就能够把读的进程数设置大一点,写的进程数设置的小一点。函数

怎么修改呢,找到mysql的配置文件,在[mysqld]节点下加入下面参数的便可

 

缓存配置

在说缓存配置以前我们先了解清楚,计算机在处理任务的时候是怎么处理的,先从磁盘上读取数据,而后放到内存里面,cpu去内存里面拿数据,而后处理。

在写的时候正好相反,cpu处理完以后,把数据放到内存里面,内存再放到磁盘里。

那从上面,咱们发现,若是数据直接从内存里面拿的话,那速度就快不少了,咱们看下面的图,读1M的数据,内存里面比从磁盘上快多少。

 

从上面这个图咱们发现从内存里面读数据比从磁盘里面取数据快了N倍。

那到mysql里面,若是取数据的时候,mysql先把一些数据缓存到内存里面的话,取数据直接从内存里面取不就快不少了。

我们在说mysql缓存以前,先说下mysql在执行一条查询语句的时候都作了什么。

从上面的图咱们发现,mysql是有两个地方检查了内存的。若是内存里面找到咱们想要的数据,那么就不去磁盘上查询数据了。那么这两个缓存都是什么,怎么配置呢。

qcache配置
  • 缓存完整的SELECT语句和查询结果,当查询命中缓存,MySQL会马上返回结果,跳过解析、优化和执行阶段。
  • 查询缓存会跟踪系统中的每张表,若是这些表发生变化,那么和这张表相关的全部查询缓存所有失效。
  • 在检查查询缓存的时候,MySQL不会对SQL进行任何处理,它精确的使用客户端传来的查询(select),只要字符大小写,或者注释有一点点不一样,查询缓存就认为是不一样的查询。
  • 任何一个包含不肯定的函数(好比now(),current_date())的查询不会被缓存。
  • MySQL查询缓存能够改善性能,可是在使用的时候也有一些问题须要注意:

开启查询缓存对于读写都增长了额外的开销。对于读,在查询开始前须要先检查缓存;对于写,在写入后须要更新缓存。
通常状况这些开销相对较小,因此查询缓存通常仍是有好处的。但也要根据业务特征权衡是否须要开启查询缓存。

怎么配置呢,找到mysql的配置文件,在[mysqld]节点下加入下面参数的便可

 

innodb_buffer_pool配置

mysql里面还有一个缓存配置就是innodb_buffer_pool的配置,innodb是如今mysql的默认存储引擎,存储引擎说白了就mysql存数据的时候究竟是怎么存的。

就是一个仓库里面怎么摆放货物的。

buffer pool是innodb存储引擎带的一个缓存池,查询数据的时候,它首先会从内存中查询,若是内存中存在的话,直接返回,从而提升查询响应时间。
innodb buffer pool和qcache的区别是:qcacche缓存的是sql语句对应的结果集,buffer pool中缓存的是表中的数据。buffer pool通常设置为服务器物理内存的70%。

怎么配置呢,找到mysql的配置文件,在[mysqld]节点下加入下面参数的便可

 

mysql架构上的优化

读写分离

多点写入

数据库表结构优化

固然系统在设计表结构的时候,通常都是架构师和一帮开发已经把表结构设计好了,我们没达到那个级别架构上的东西咱也不懂,就在设计表结构的时候须要注意的一些东西。

       一、使用能够存下你的数据的最小数据类型
       二、使用简单的数据类型,int类型和varchar类型上,mysql处理int类型更简单
       三、尽量的使用not null定义字段,能够为空的字段加上默认值
            由于若是不限制not null的话,字段值是能够为空的,默认为空就是null,若是是not null的话字段值写空的话,就要写'',一个空的字符串。
            null它在mysql里面也是要占用空间的,也不能利用索引,而空的字符串在mysql是不占用空间的,也能够利用索引。
       四、时间类型的,用UNIX_TIMESTAMP,由于是int类型的
mysql索引优化

索引是什么呢,就和字典的目录同样。有目录了,那我们查数据就快了。

最适合建索引的列是出如今where子句后面的列。

惟一索引的效果最好,由于是惟一的。

利用最左前缀。

索引并非越多越好。

mysql索引有4种类型

一、普通索引

最普通的索引,全部列均可以加

二、主键索引

建表的时候加的主键

三、组合索引

 

四、惟一索引

 

 去除重复、冗余索引

由于每一个开发的水平都不同,不可避免的的会出现一些重复索引的问题。那咱们怎么来查找有一些冗余的索引呢。

就要借助percona-toolkit这个工具了,它里面有pt-duplicate-key-checker这个工具能够帮我们找出来哪些表里面有冗余的索引,并给出修改索引的语句。

 

这个能帮我们找出来重复的索引,那还有一些根本就没有必要用的索引,虽然索引创建的并非重复,可是实际上并没用查询语句用到它,怎么办呢,percona-toolkit这个工具里还有一个工具是pt-index-usage,它能够读取慢查询日志,帮我们找到那些没用的索引。

 

慢查询日志

什么是慢查询日志呢,它这个就是个神器了,对我们测试特别有帮助,它会记录执行时间长的sql语句,这样我们找问题的时候就比较方便了。

mysql记录的日志里面,我们看着比较不清晰,我们使用pt-query-digest这个工具帮我们解析慢查询日志,它会把全部的sql的执行时间以及具体sql,执行了多少次都帮我们统计出来。

下面是pt-query-digest的用法

若是想实时的获取有没有执行时间长的sql,用下面这个sql语句

 

 

explain

经过慢查询日志咱们能够找到有问题的sql语句,那咱们怎么看这个sql哪有问题呢,就要使用explain了,只要在你要执行sql语句前面加上explain便可

all<index<range<ref<eq_ref<const,system sql执行type列里最差到最优

sql优化时候须要注意的

查询条件使用索引列,排序使用索引列

避免select *,通常select * 都会形成全表扫描

尽可能避免子查询,MySQL 的子查询执行计划一直存在较大的问题,虽然这个问题已经存在多年,可是到目前已经发布的全部稳定版本中都广泛存在,一直没有太大改善。虽然官方也在很早就认可这一问题,而且承诺尽快解决,可是至少到目前为止咱们尚未看到哪个版本较好的解决了这一问题。

事物

银行存钱例子。

表级锁、行级锁。

SELECT * FROM information_schema.INNODB_TRX\G

mysql性能测试工具

mysqlslap是mysql自带的一个性能测试工具。它能够模拟各类并发,以及使用哪一种sql,生成多少数据,运行多久,产生报告。

经常使用的选项

下面是使用的例子

相关文章
相关标签/搜索