1.硬件方面
磁盘的I/O是制约mysql性能的最大因素之一。
推荐使用RAID1+0磁盘阵列,不要去考虑RAID-5,性能根本不会像你想的那样块
CPU的话,多核心CPU
对于内存的话,推荐4G以上的物理内存。
2.mysql应该采用编译安装的方法
建议使用centos x86_64位,源码包的编译参数会默认的以Debug模式生成二进制代码,而Debug模式给Mysql带来的性能损失是比较大的,所以当我们编译准备安装时,一定不要忘记使用--without-debug参数禁用Debug模式。如果把--with-mysqld-ldflags 和 --with-client-ldflags 两个编译参数设置为--all-static的话,可以告诉编译器以静态的方式编译,编译结果将得到最高的性能。使用静态编译和使用动态编译的代码相比,性能差距可能会达到5%到10%之多。在后面的章节我会跟大家分享我们先上Mysql数据库的编译参数,大家可以参考一下,根据自己的线上环境自行修改内容。
3.Mysql配置文件的优化
[mysqld]
mysqld族中包括了 mysqld服务启动的参数,它涉及的方面很多,其中有Mysql的目录和文件、通信、网络、信息安全、内存管理、优化、查询缓存区、还有Mysql日志设置等
port = 3306 mysqld服务运行时的端口号
socket = tmp/mysql.sock Linux环境下特有的文件,用户在Linux环境下客户端连接可 以不通过TCP/IP网络而直接使用unix socket连接Mysql
skip-locaking 避免Mysql的外部锁定,减少出错几率,增强稳定性
skip-name-resolve 禁止Mysql对外部连接进行DNS解析,这样连接速度很快很多。
back_log = 384 Mysql暂时停止响应新请求之前,指定到来的TCP/IP连接的监听队列 的大小,如果系统短时间内有很多连接,则需要增大该参数值。推 荐设置为小于512的整数。
key_buffer_size = 384M 指定用于索引的缓冲区大小,增加它可以得到更好的索引处理性能。 对于内存在4G左右的服务器来说,该参数设置为256MB 或 384MB
注意:如果该参数值设置的过大反而会使服务器的整体效率降低!
max_allowed_packet = 4M 设置在网络传输中一次消息传输量的最大值。系统默认为1MB,最大 为1GB,必须设定为1024的倍数,单位为字节。
thread_stack = 256K 设置Mysql每个线程的堆栈大小,默认值足够大,可以满足普通操 作。可以设置范围为128KB -4GB 默认为192KB
table_cache = 614K 表示告诉缓冲区的大小,当Mysql访问一个表时,如果在mysql表缓 冲区还有空间,那么这个表就被打开并放入表缓冲区。可以查看数 据库运行峰值时间的状态值Open_tables 和 Opened_tables,来判断 是否需要增加table_cache的值。如果Open_tables接近table_cache 的时候,并且Opened_tables的值在逐渐增加,哪就得考虑增加这个 值的大小了。
sort_buffer_size = 6M 设定查询排序时所能使用的缓冲区大小,默认为2MB,在5.1.23版本 开始,在除了windows之外的64位平台上可以超出4GB的限制。
注意:该参数对应的分配内存是每个连接独占的,如果100个连接,那么实际分配的总排序缓冲区大小为100 * 6 = 600MB。所以对于内存在4GB左右的服务器来说,推荐设置为6MB-8MB.
read_buffer_size = 4M 读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参 数对分配内存也是每个连接独享。
join_buffer_size = 8M 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该 参数对分配内存也是每个连接独享。
myisam_sort_buffer_size = 64MB 设置在repair table火用create index创建索引或 alter table的过程中排序索引所分配的缓冲区大小,范围4B-4GB
thread_cache_size = 64 设置thread cache池中可以缓存的连接线程最大数量可以设置为0- 16384,当断开连接时如果缓存中还有空间,那么客户端的线程将被 放到缓存中;如果线程重新被请求,那么请求将从缓存中读取;如 果有很多请求,增加这个值可以改善系统性能。我们可以根据物理 内存设置规则如下:1GB内存配置为8,2GB内存配置为16,3GB内存配 置为32,4GB内存以上可以配为64或者更大的数值。
query_cache_size = 64M 指定Mysql查询缓冲区的大小。可以通过Mysql控制台观察,如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况;如果Qcache_hits的值非常大,则表明查询缓冲使用的非常频繁。另外,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲。对于Qcache_free_blocks,如果该值非常大,表示缓冲区中碎片很多。
tmp_table_size = 256M 设置内存临时表最大值。如果超过该值,则会将临时表写入磁盘。
max_connections = 5000 指定Mysql允许的最大连接进程数。如果在访问论坛是经常出现Too Many Connections的错误提示,则需要增加该参数值。
max_connect_errors = 6000 设置每个主机的连接请求异常中断的最大次数,当超过该次数Mysql服务器将禁止host的连接请求,知道mysql服务器重启或者通过flush hosts命令清空此host的信息
wait_timeout = 120 指定一个请求的最大连接时间,对于4GB左右内存的服务器来说,可以将其设置为5-10。
thread_concurrency = 8 该参数取值为服务器逻辑CPU数量*2
skip-networking 彻底关闭mysql的TCP/IP连接方式,如果web服务器是通过远程连接访问mysql,则不要开启该选项,否则将无法正常连接!
table_cache = 614 给经常访问的表分配的内存,物理内存越大,设置就越大,调大这个值,一般情况下可以降低磁盘IO,单相应会占用更多的内存,这里设置为614。
innodb_additional_mem_pool_size = 4M 默认为1MB.
innodb_flush_log_at_trx_commit = 1 设置为1,也是最安全的设置。
innodb_log_buffer_size = 2M 通常设置8-16MB就足够了。
innodb_thread_concurrency = 8 你的服务器有几个CPU就设置为几,一般为8。
tmp_table_size = 64M 设置内存临时表最大值。如果超过该值,将临时表写入磁盘。
read_rnd_buffer_size = 16M 设置随机读的时候所使用的缓冲区。此参数和read_buffer_size所设置的buffer相反,一个是顺序读的时候使用,一个是随机读的时候使用。但是两者都是针对于线程的设置,每个线程都可以产生两种Buffer中的任何一个。默认为256KB,最大为4GB。
值得注意的是:
1:强烈建议不要武断的将Inno DB的Buffer Pool值配置为物理内存的50%-80%。根据具体环境而定
2:若key_reads太大,则把my.cnf中的key_buffer_size变大,保持key_reads/key_read_requests至少在1/100以上,越小越好。
3:如果qcache_lowmem_prunes很大,就要增加query_cache_size的值。
不过很多时候需要具体情况具体分析,其他参数的变更我们可以等Mysql上限稳定一段时间后再根据status值进行调整。
附上电子商务网站mysql数据库调整后所运行的配置文件/etc/my.cnf 大家可以根据自己的实际mysql数据库的硬件情况调整。配置文件内容: