详解MySQL性能优化方案

MySQL性能优化方案

1、影响MySQL性能的因素

1.1硬件

硬件就是服务器配置,cpu,内存,硬盘等

1.2系统配置

系统配置值操作系统的配置。Linux服务器的一切东西都是基于文件的,mysql的数据都是以文件形式存在在磁盘上的

1.2.1最大打开文件数量

Linux系统有一个文件打开数量的系统配置,默认是1024。对于并发大数据表多的情况下是不够用的,我们可以修改这个系统配置参数。路径为/etc/security/limits.conf。

limits.conf文件相关说明:

type:soft/hard/-
soft指当前系统生效的设置值。
hard指系统所能设定的最大值。
soft不能比hard高。-表示同时设置soft和hard的值

item:
core       -限制内核文件的大小
date       -最大数据大小
fsize      -最大文件大小
memlock    -最大锁定内存地址空间
nofile     -打开文件的最大数目
rss        -最大持久设置大小
stack      -最大栈大小
cpu        -以分钟为单位的最多cpu时间
noproc     -最大进程数目
as         -地址空间限制
maxlogins  -此用户允许登录的最大数目

1.2.2 sleep超时时间

MySQL默认8小时不操作数据库自动关闭。当有程序缺陷时就会一直占用数据库连接数,并发大的时候会导致连接不上数据库。

通过下面命令重新设置sleep的时间

set global wait_timeout=600; #设置sleep的超时时间,单位秒

show variables like '%wait_timeout%'; #查询超时时间

1.2.3独立表空间设置

表空间:数据表存放数据的地方

小栗子:

一个仓库,你要往仓库里面放东西的话,来一些东西你就随便扔到里面,这样东西一多,你要找到一个东西 就很难找了。
那怎么办呢,我在仓库里面放几个货架,每个货架放同一个种类的东西,这样的话,找一个东西 就很方便了。
表空间就和这个货架差不多,每个表单独管理的话,那找数据就比较方便了。
 
mysql5.6.6之前默认是共享表空间,mysql5.6.6之后默认是独立表空间
 

共享表空间:就是说这个空间是所有的表都共享的,所有的表的数据都存在一个地方的。

想一想所有的货架都存在一个仓库里面的话,快递员去拿货的时候,人一多,可能进出都要排队,拿货的时候就比较慢了。
 
所以说共享表空间在数据量和并发量大的情况下,对IO消耗很大,影响性能
 
共享表空间的缺点:不能自动收缩
 
什么是自动收缩?
 
刚建表的时候,表里面数据很少,就1条数据,可能占用空间就几kb,到后来数据多了,占用了10G的空间,然后发现有一些数据都是垃圾数据,删了5G,那这个时候表空间就不会自动减小了,它还是10G,浪费空间。
 
设置独立表空间打开
set global innodb_file_per_table=NO; #设置独立表空间打开

show variables like '%per_table%'; #查看是否独立表空间

1.2.4 读/写进程数配置

mysql5.5以后读写进程可以配置,默认读和写的进程数是4个。
 
修改mysql配置文件,在[mysqlld]节点下加入以下参数
innodb_read_io_threads=5 #读进程数

innodb_write_io_threads=3 #写进程数

1.2.5缓存配置

计算机在处理任务时的流程是怎样的?

读:先在磁盘读取数据,然后放到内存中,cpu去内存中拿数据,再处理。

写:cpu处理完,写内存,再把从内存放到磁盘中。

mysql执行查询语句流程是怎样的?

查询缓存会跟踪系统中的每张表,如果这些表发生变化,那么和这张表相关的所有查询缓存全部失效,当查询命中缓存时,mysql会跳过解析、优化和执行阶段,直接返回结果。

开启缓存对于读写也增加了额外的开销,对于读,在查询开始前需先检查缓存;对于写,在写入数据后需更新缓存,一般情况下这些开销相对较小,在实际应用时可根据业务特征权衡是否开启查询缓存。

开启查询缓存,在mysql配置文件[mysqlld]加入下列参数

query_cache_size=200M #分配给查询缓存的总内存,一般不建议超过256M

query_cache_limit=1M #单个查询缓存的最大内存,查询结果比这个大,就不会缓存。

show variables like '%query_cache%'; #查询缓存的状态

innodb_buffer_pool

buffer pool是innodb存储引擎带的缓存池,查询数据时,会先在内存中查询,内存中存在就直接返回,节省查询响应时间

innodb_buffer_pool和qcache的区别是:buffer_pool缓存的是表中的数据,qcache缓存的是sql语句对应的结果集。

innodb_buffer_pool参数设置

innodb_buffer_pool_size=50M #缓存池的大小

innodb_buffer_pool_dump_now=on #停止mysql服务时,innodb讲缓存池中的热数据保存到本地磁盘

innodb_buffer_pool_load_at_startup=on #启动mysql服务时,mysql将本地热数据加载到缓存池中


show variables like '%innodb_buffer_pool%'; 查看buffer_pool的大小

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章