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独立表空间设置
表空间:数据表存放数据的地方
小栗子:
一个仓库,你要往仓库里面放东西的话,来一些东西你就随便扔到里面,这样东西一多,你要找到一个东西 就很难找了。
那怎么办呢,我在仓库里面放几个货架,每个货架放同一个种类的东西,这样的话,找一个东西 就很方便了。
共享表空间:就是说这个空间是所有的表都共享的,所有的表的数据都存在一个地方的。
set global innodb_file_per_table=NO; #设置独立表空间打开
show variables like '%per_table%'; #查看是否独立表空间
1.2.4 读/写进程数配置
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的大小