优化mysql性能的参数,mysql配置文件参数优化
如何设置MySQL系统变量来调优性能?
(1)、back_log:
MySQL需要的连接数。当MySQL主线程在短时间内获得大量连接请求,然后主线程需要一些时间(虽然很短)来检查连接并启动一个新线程时,这是可行的。
back_log的值表示在MySQL暂时停止应答新请求之前,短时间内栈中可以存储多少个请求。如果只是期望短时间内有很多人脉,那就需要增加了。换句话说,该值影响传入TCP/IP连接的侦听队列的大小。您的操作系统对此队列的大小有自己的限制。试图将back_log设置得高于操作系统的限制将是无效的。
当你观察你的主机进程列表,发现有大量的264084 未认证用户 XXX . XXX . XXX null connect null log in null进程要连接时,你就要增加back_log的值。默认值是50,所以我把它改成了500。
(2)、交互_超时:
服务器在关闭交互式连接之前等待该连接动作的秒数。交互式客户定义为使用mysql_real_connect()的CLIENT_INTERACTIVE选项的客户。默认值为28800。我把它改成了7200。
、key_buffer_size:
索引由所有线程缓冲和共享。Key_buffer_size是用于索引块的缓冲区大小。尽可能地增加它以获得更好的索引(对于所有读取和多次重写)。如果你把它做得太大,系统就会开始换页,真的会变慢。默认值是8388600(8M),我的MySQL主机有2GB内存,所以我改成了402649088(400MB)。
(4)、最大连接数:
允许的同时客户数量。增加这个值会增加mysqld所需的文件描述符的数量。这个数字应该增加,否则,您将经常看到太多的连接错误。默认值是100,所以我把它改成了1024。
(5)、记录_缓冲区:
每个执行顺序扫描的线程都会为它扫描的每个表分配一个这样大小的缓冲区。如果您执行大量的顺序扫描,您可能希望增加该值。默认值是131072(128K),我把它改成了16773120 (16M)
(6)、排序_缓冲区:
每个需要排序的线程都被分配一个这样大小的缓冲区。增加该值可以加快ORDER BY或GROUP BY操作的速度。默认值是2097144(2M)。我改成了16777208 (16M)。
(7)、表_缓存:
所有线程打开的表的数量。增加这个值可以增加mysqld所需的文件描述符的数量。MySQL要求每个唯一打开的表有2个文件描述符。默认值是64,所以我把它改成了512。
(8)线程_缓存_大小:
中保存的可以重用的线程数。如果有,则从缓存中检索新线程,当连接断开时,如果有空间,则将客户的线放在缓存中。如果有许多新线程,这个变量值可以用来提高性能。通过比较Connections和Threads_created状态下的变量,可以看出这个变量的作用。我把它设置为80。
(10)、wait_timeout:
服务器在关闭连接之前等待连接操作的秒数。默认值为28800。我把它改成了7200。
注意:参数的调整可以通过修改/etc/my.cnf文件,重启MySQL来实现。这是一项谨慎的工作,以上结果只是我的一些看法。可以根据自己主机的硬件情况(尤其是内存大小)进一步修改。
====================================================================================
在Apache、PHP、MySQL的架构中,MySQL对性能的影响最大,也是关键的核心部分。为了Discuz!论坛计划也是如此。MySQL设置是否合理优化,直接影响论坛的速度和承载量!同时,MySQL也是优化最难的部分,不仅需要了解一些MySQL专业知识,还需要长期的观察和统计,根据经验判断,然后设置合理的参数。
让我们来看看MySQL优化的一些基础知识。MySQL的优化分为两部分,一是服务器物理硬件的优化;第二,MySQL本身的优化(my.cnf)。
(1)服务器硬件对MySQL性能的影响
a)磁盘寻道功能(磁盘I/O)。以现在的高速SCSI硬盘(7200转)为例。这个硬盘理论上每秒寻道7200次,这是物理特性决定的,没有办法改变。MySQL每秒都在进行大量复杂的查询操作,对磁盘的读写量可想而知。因此,一般认为磁盘I/O是制约MySQL性能的最大因素之一。对于日均访问超过100万PV的Discuz!论坛,由于磁盘I/O的限制,MySQL的性能会很低!为了解决这一限制,可以考虑以下解决方案:
使用RAID-0 1磁盘阵列,注意不要尝试RAID-5,MySQL在RAID-5磁盘阵列上的效率不会像你预期的那么快;抛弃传统硬盘,使用速度更快的闪存设备。路过Discuz!在公司的技术工程测试中,闪存设备的速度比传统硬盘高6-10倍左右。
B) CPU对于MySQL应用,建议使用S.M.P架构的多路对称CPU。例如,可以使用两个英特尔至强3.6GHz CPUs。
c)物理内存对于使用MySQL的数据库服务器,建议服务器内存不小于2GB,建议使用4GB以上的物理内存。
(2) MySQL自身因素解决了上面的服务器硬件限制之后,我们再来看看MySQL自身的优化是如何工作的。MySQL本身的优化主要是对其配置文件my.cnf中的参数进行优化调整,下面是一些对性能影响较大的参数。
由于my.cnf文件的优化设置与服务器硬件配置密切相关,我们指定一个假设的服务器硬件环境:
CPU: 2个英特尔至强2.4GHz处理器
内存:4GB DDR
硬盘:SCSI 73GB
下面,我们根据上面的硬件配置结合一个优化后的my.cnf进行说明:
# vi /etc/my.cnf
以下仅列出my.cnf文件中[mysqld]段落中的内容。其他段落对MySQL性能影响不大,可以忽略。
[mysqld]
端口=3306
serverid=1
socket=/tmp/mysql.sock
跳跃锁定
#避免MySQL的外部锁定,降低错误概率,增强稳定性。
跳过名称解析
禁止MySQL解析外部连接的DNS。使用这个选项可以减少MySQL解析DNS的时间。但是需要注意的是,如果开启了这个选项,所有的远程主机连接授权都必须使用IP地址,否则MySQL将无法正常处理连接请求!
back_log=384
指定MySQL的可能连接数。当MySQL主线程短时间内收到大量连接请求时,该参数生效,主线程用很短的时间检查连接并启动一个新线程。
back_log参数的值表示在MySQL暂时停止响应新请求之前,短时间内堆栈中可以存储多少个请求。如果系统在短时间内有许多连接,您需要增加该参数的值,该参数指定传入TCP/IP连接的监听队列的大小。不同的操作系统对队列大小有自己的限制。
试图将back_log设置得高于操作系统的限制将是无效的。默认值为50。对于Linux系统,建议将其设置为小于512的整数。
key_buffer_size=256M
# key_buffer_size指定用于索引的缓冲区大小。增加它可以获得更好的索引处理性能。
对于内存约为4GB的服务器,该参数可以设置为256M或384M。
注意:将该参数设置得太大会降低服务器的整体效率!
最大允许数据包=4M
线程堆栈=256K
table_cache=128K
排序缓冲区大小=6M
排序时可以使用的缓冲区大小。注意:对应于该参数的分配内存是每个连接独占的!如果有100个连接,实际分配的总排序缓冲区大小是100 6=600 MB。所以对于4GB左右内存的服务器,建议设置为6-8M。
读取缓冲区大小=4M
查询操作可以使用的缓冲区大小。和sort_buffer_size一样,这个参数对应的分配内存是每个连接独占的!
join_buffer_size=8M
联合查询操作可以使用的缓冲区大小与sort_buffer_size相同,该参数对应的分配内存是每个连接独占的!
myisam_sort_buffer_size=64M
表缓存=512
thread_cache_size=64
查询缓存大小=64M
指定MySQL查询缓冲区的大小。您可以通过在MySQL控制台中执行以下命令来观察它:
#显示类似“%query_cache%”的变量;
#显示类似“Qcache%”的状态;
#如果Qcache_lowmem_prunes的值很大,说明经常缓冲不足;
如果Qcache_hits的值非常大,则表明查询缓冲区的使用非常频繁。如果值很小,会影响效率,可以考虑不使用查询缓冲区。Qcache_free_blocks,如果这个值很大,说明缓冲区有很多碎片。
tmp_table_size=256M
max_connections=768
指定MySQL允许的最大连接进程数。如果访问论坛时经常出现连接过多的错误提及,则需要增加该参数的值。
最大连接错误数=10000000
wait_timeout=10
指定请求的最大连接时间,对于内存约为4GB的服务器,可以设置为5-10。
线程并发=8
该参数的值是服务器的逻辑CPU数量 2。在这个例子中,服务器有两个物理CPU,每个物理CPU都支持H.T .超线程,所以实际值是4 2=8。
跳过网络
开启此选项可以完全关闭MySQL的TCP/IP连接模式。如果WEB服务器通过远程连接访问MySQL数据库服务器,就不要打开这个选项!否则,将无法正常连接。