Mysql 数据库的优化mysql
最近一直在搞Mysql数据库的配置和优化,下面记录一下这些天研究的结果,以方便之后查看。
1、服务器的硬件的优化
对mysql服务器来讲主要从如下几个方面来考虑:
一、磁盘寻道能力(磁盘I/O)
由于Mysql每一秒都在进行着大量的、复杂的查询操做,对磁盘的读写可想而知,因此一般认为磁盘的I/O是制约Mysql性能的最大因素之一。若是磁盘的I/O性能很差,形成的直接后果就是MySqL的性能很是低下,对于这种状况能够考虑使用RAID1+0。对于硬盘来讲最好选那种转速比较快的,这样数据的操做的效率也会有大的提升。
二、cpu对于Mysqlr 影响也是不容忽视的,要选择运算能力强悍的cpu.
三、内存不要小于2GB,最好使用4GB以上的物理内存。
四、服务器选择上能够dell的R710 2颗cpu(双四核) 16G内存(这个能够扩展的)硬盘有两种选择:一个是300G、15000r的,一种是500G的7200r的 能够根据本身的须要来选择。也可选HP的DL580G5。我在工做中使用的dell的R710。
2、MySqL配置文件的优化
MySqL在服务器上安装最好是选择源码编译安装。对于MySqL的优化主要是在/etc/my.cnf这个文件中来修改一些参数。
在这个文件中主要的参数是在[mysqld]这部分中,这部分中主要包括了mysqld服务启动参数,它涉及的方面不少,其中有MysqL的目录文件和文件、通讯、网络、信息安全、内存管理、优化、查询缓存区,还有MySql的日志设置等。下面就来看一下这个有文件中的参数:
port = 3306
// mysql服务的运行时的端口
socket = /tmp/mysql.sock
//socket文件是在Linux/Unix环境下特有的,用户在Linux/Unix环境下客户端链接能够不经过TCP/IP网络而直接使用unix socket链接MySqL。
skip-locking
//避免MySqL的外部锁定,减小出错率,加强稳定性。
skip-name-resolve
//禁止MySQL对外部链接进行DNS解析,使用这一选项能够消除MySQL进行DNS解析的时间。但须要注意的是,若是开启该选项,财全部远程主机链接受权都要使用IP地址的方式了,不然MySQL将没法正常处理链接请求!
back_log = 256
//back_log参数的值指出在MySqL暂时中止响应新请求以前,短期内多少个请求能够被存在堆栈中。若是系统在短期内有不少链接,则须要增大该参数的值,该参数值指定到来的TCP/IP链接的监听队列的大小。不一样操做系统在这个队列的大小上有本身的限制。若是试图将back_log设定得高于操做系统的限制将是无效的。其默认值为50。对于Linux系统而言,推荐设置为小于512的整数。
key_buffer_size = 256
//指定用于索引的缓冲区大小,增长它可获得更好的索引处理性能。对于内存4GB左右的服务器来讲,该参数可设置为256MB或者384MB。
max_allowed_packet = 1M
//设定在网络传输中一次消息量的最大值。系统默认为1MB,最大值1GB,必须设定为1024的倍数,单位为字节。
thread_stack = 192K
//设置MySQL每一个线程的堆栈大小,默认值足够大,可知足普通操做。可设置范围为128KB至4GB。默认为192KB。
table_cache = 614K (mysql 5.1.3以后这个设置就变为了table_open_cache)
//指示表高速缓冲区的大小。当MySqL访问一个表时,若是在MySQL表缓冲区中还有空间,那么这个表就被打开并放入表缓冲区,这样作的好处是能够更快速地访问表中的内容。通常来讲,能够查看数据库运行峰值时间的状态值Open_tables和Opened_tables,用以判断是否须要增长table_cache的值,即若是Open_cache的接近table_cache的时候,而且Opened_tables这个值在逐渐增长,那就要考虑增长这个值的大小了。
sort_buffer_size = 6M
//设定查询排序时使用的缓冲区大小,系统默认大小为2MB。注意::这个参数对应的分配内存是每一个链接独占的,若是有100个链接,那么实际分配的总排序缓冲区大小为100x6=600MB。因此,对于内存在4GB左右的服务器来讲,推荐将其设置为6MB到8MB
read_buffer_size = 2M
//读查询操做所能使用的缓冲区大小。和sort_buffer_size同样,该参数对应的分配内存也是每一个链接独享。
join_buffer_size = 4M
//联合查询操做所能使用的缓冲区大小,和sort_buffer_size同样,该参数对应的分配内存也是每一个链接独享。
myisam_sort_buffer_size = 8M
//设置在REPAIR TABLE或用CAREATE INDEX建立索引或ALTER TABLE 的过程当中排序索引所分配的缓冲区大小,可设置范围4Bytes到4GB,默认为8MB。
thread_cache_size = 64
//设置Thread Cache池中能够缓存的链接线程的最大数量,能够设置为0~16384,默认为0。这个值表示能够从新利用保存在缓存中线程的数量。当断开链接时若是缓存中还有空间,那么客户端的线程将被放到缓存中;若是线程从新被请求,那么请求将从缓存中读取;若是缓存中是空的或者是新的请求,那么这个线程将被从新建立;若是有不少新的线程,增长这个值能够改善系统性能。经过比较Connections和Threads_created状态的变量,能够看到这个变量的做用。咱们能够根据物理内存设置规则以下:1GB内存咱们配置为8,2GB内存咱们配置为16,3GB咱们配置为32,4GB或更大的咱们给此值为64或更大的数值。
query_cache_size=256M
//指定MySQL查询缓冲的大小。能够经过在MySQL控制台观察,若是Qcache_lowmem_prunes的值很是大,则代表常常出现缓冲不够的状况;若是Qcache_hits的值很是大,则代表查询缓冲使用得很是频繁。另外,若是该值较小反而会影响效率,那么能够考虑不用查询缓冲。对于Qcache_free_block,若是该值很是大,则代表缓冲区中碎片不少。
tmp_table_size = 256M
//设置内存临时表最大值。若是超过该值,则将会把临时表写入磁盘,其范围为1KB到4GB。
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数量X2,在本例中,服务器有两个物理CPU,而每一个物理CPU又支持H.T超线程,因此实际取值为4X2=8。这也是目前双四核主流服务器的配置。
skip-networking
//开启该选项能够完全关闭MySQL的TCP/IP链接方式,若是Web服务器是以远程链接的方式访问MySQL数据库服务器的,则不要开启该选项,不然将没法正常链接!
table_cache = 614 (这个在5.1.3后就变成了table_open_cache)
//给常常访问的表分配的内存,物理内存越大,设置就越大。调大这个值,通常状况下能够下降磁盘IO,可是相应的会占用更多的物理内存,这这里设置为614
innodb_addition_mem_pool_size = 1M
//默认为1MB
innodb_flush_log_at_trx_commit = 1
//设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1,也是最安全的设置。
innodb_log_buffer_size = 2M
//默认为1MB,一般设置为8~16MB就足够了。
innodb_thread_concurrency = 8
//你的服务器有几个CPU就设置为几,建议用默认设置,通常为8.
read_rnd_buffer_size = 16M
//设置进行随机读的时候所使用的缓冲区。此参数和read_buffer_size所设置的Buffer相反,一个是顺序读的时候使用,一个是随机读的时候使用。可是二者都是针对线程的设置,每一个线程均可以产生两种Buffer中的任何一个。read_rnd_buffer_size的默认值256KB,最大值4GB。
以上只一些理论参考值,不少时候须要具体状况具体分析,其余参数的变动咱们能够等MySQL上线稳定一段时间后再根据status值进行调整。