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数据库的硬件情况调整。配置文件内容: