mysql优化方案

一、优化方向

1、主机层面 五大资源+内核
2、服务层面 找到该服务在架构中的核心功能→核心优化
3、代码、业务层面 →协助/辅助方向
4、对接(tomcat connector nginx →php→fpm模块 fastCGI 9000)

二、硬件方面优化

优化服务器硬件的方法主要有以下几种:

  • 配置较大的内存
  • 配置高速磁盘系统,以减少读盘的等待时间,提高响应速度
  • 合理分布磁盘 I/O,把磁盘 I/O 分散在多个设备上,以减少资源竞争,提高并行操作能力
  • 配置多处理器,MySQL 是多线程的数据库,多处理器可同时执行多个线程

三、软件配置

1、网络方面的配置,要修改/etc/sysctl.conf文件

增加tcp支持的队列数

net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_fin_timeout = 30
#TIME_WAIT超时时间,默认是60s
net.ipv4.tcp_tw_reuse = 1
#1表示开启复用,允许TIME_WAIT socket重新用于新的TCP连接,0表示关闭
net.ipv4.tcp_tw_recycle = 1
#1表示开启TIME_WAIT socket快速回收,0表示关闭
net.ipv4.tcp_max_tw_buckets = 4096
#系统保持TIME_WAIT socket最大数量,如果超出这个数,系统将随机清除一些TIME_WAIT并打印警告信息
net.ipv4.tcp_max_syn_backlog = 4096
#进入SYN队列最大长度,加大队列长度可容纳更多的等待连接

2、mysql本身的一些优化mysql配置文件 /etc/my.cnf

公共参数默认值:

max_connections = 151 #同时处理最大连接数,推荐设置最大连接数是上限连接数的80%左右 
sort_buffer_size = 2M #查询排序时缓冲区大小,只对order by和group by起作用,可增大此值为16M 
query_cache_limit = 1M #查询缓存限制,只有1M以下查询结果才会被缓存,以免结果数据较大把缓存池覆盖 
query_cache_size = 16M #查看缓冲区大小,用于缓存SELECT查询结果,下一次有同样SELECT查询将直接从缓存池返回结果,可适当成倍增加此值 
open_files_limit = 1024 #打开文件数限制,如果show global status like 'open_files'查看的值等于或者大于open_files_limit值时,程序会无法连接数据库或卡死

注意 如果存在多个位置存在配置文件,则后面配置的内容会覆盖前面的内容,后面的生效,前面的会失效。

3、innodb方案

配置参数常用的 ,

innodb_buffer_pool_size  ,非常重要的参数,用于配置innodb缓冲池的大小,如果数据库中只有innodb表,则推荐配置量为总内存的60-70%
innodb_buffer_pool_instances 5.5以后版本引进的,可以控制缓冲池的个数,增加个数可以增加并发性,该参数值默认为 1,推荐设置 4 个或 8个
innodb_log_buffer_size  innodb log 缓冲的大小,由于日志最长每秒中就会刷新所以一般不用太da。
innodb_flush_log_at_trx_commit     关键参数决定了数据库多长时间把变更刷新到磁盘,参数有三种值,对innodb的io效率影响很大,默认值为1, 可以取0,1,2三个值,一般建议为2 ,但如果数据安全性比较高则使用默认值1
innodb_read_io_threads
innodb_write_io_threads  以上两个参数决定了innodb读写的io进程数,默认为4
innodb_file_per_table  关键参数,控制innodb每一个表使用独立的表空间,默认为off,也就是所有的表都会建立在共享表空间中,建议改为on ,使用独立的表空间,
innodb _stats_on_metadata  决定了mysql在什么情况下会刷新innodb表的统计信息,在show table时 会刷新表统计信息, 建议设置为off 这样就不会show table 刷新表统计信息。

4、MyISAM 参数配置

下面设置仅针对以 MyISAM 引擎为主的 DB。如果以 InnoDB 引擎为主的 DB则跳过此节。

4.1,设置索引缓存区大小

索引缓存区大小一般设置物理内存的 30% - **40%。

key_buffer_size = 2048M

4.2,设置读操作缓冲区大小

读操作缓冲区大小默认为 128K。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。一般设置为 2M 就足够了。

read_buffer_size = 2M

4.3,设置查询缓存功能

(1)为了加快查询语句的执行性能,从MySQL早期的版本开始就提供了一种名叫 Query Cache 的缓存技术。
Query Cache 的工作原理:当某一个客户端连接(session)进行 SQL查询并得到返回信息时,MySQL 数据库除了将查询结果返回给客户端外,还在特定的内存区域缓存这条 SQL查询语句的结果,以便包括这个客户端在内的所有客户的再次执行相同查询请求时,MySQL能够直接从缓存区返回结果。
2)下面配置将 query_cache_type设置为 1表示开启查询缓存功能,同时设置 Query Cache的缓冲区大小为 32M。

query_cache_type = 1``query_cache_size = 32M

四、架构优化

随着业务量越来越大,单台数据库服务器性能已无法满足业务需求,该考虑加机器了,该做集群了~~~。主要思想是分解单台数据库负载,突破磁盘I/O性能,热数据存放缓存中,降低磁盘I/O访问频率。

4.1 主从复制与读写分离

因为生产环境中,数据库大多都是读操作,所以部署一主多从架构,主数据库负责写操作,并做双击热备,多台从数据库做负载均衡,负责读操作,主流的负载均衡器有LVS、HAProxy、Nginx。
主从复制、读写分离

4.2 增加缓存

给数据库增加缓存系统,把热数据缓存到内存中,如果缓存中有要请求的数据就不再去数据库中返回结果,提高读性能。缓存实现有本地缓存和分布式缓存,本地缓存是将数据缓存到本地服务器内存中或者文件中。分布式缓存可以缓存海量数据,扩展性好,主流的分布式缓存系统有memcached、redis,memcached性能稳定,数据缓存在内存中,速度很快,QPS可达8w左右。如果想数据持久化就选择用redis,性能不低于memcached。
redis

五、 性能状态关键指标

开启慢查询日志
MySQL开启慢查询日志,分析出哪条SQL语句比较慢,使用set设置变量,重启服务失效,可以在my.cnf添加参数永久生效。

mysql> set global slow-query-log=on  #开启慢查询功能
mysql> set global slow_query_log_file='/var/log/mysql/mysql-slow.log';  #指定慢查询日志文件位置
mysql> set global log_queries_not_using_indexes=on;   #记录没有使用索引的查询
mysql> set global long_query_time=1;   #只记录处理时间1s以上的慢查询
上一篇:如何将word公式粘贴到UMEditor里面


下一篇:poj2777 线段树状态压缩