MySQL参数调整

本文介绍了MySQL安装后需要调整的关键配置参数,包括key_buffer_size、innodb_buffer_pool_size等,以及这些参数对性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 原文: http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/

我喜欢问别人在安装了MySQL之后,其默认的配置应该怎么改。但令人惊讶的是很多人都无法给出一个合理的理由。虽然MySQL有许多可以调整的变量,但对于大多数的情况它们中只有少数有用。只要把这几个设好了,其他的对于多数情况只能起到锦上添花的作用。

 

key_buffer_size
如 果用MyISAM则非常重要。如果只用MyISAM表,那么设成可用内存的30%到40%。主要决定于索引的数量,数据的多少和读写量。要知道 MyISAM? 是用系统的缓存来缓存数据的,而数据通常比索引大很多,所以你需要留一部分内存给系统。记得检查是否所有的key_buffer都被用到,经常看到有人把它设成4G,而所有的MYI文件加起来才1G(4G呀,看到的次数还不少,真是羡慕。内存不是这么浪费的)。如果用的MySIAM表很少,那么可以把它设得比较少,但至少要有16-32M,提供给创建的临时表的索引用。

 

innodb_buffer_pool_size
如 果用Innodb,那么这是一个重要变量。相对于MyISAM来说,Innodb对于buffer size更敏感。MySIAM可能对于大数据量使用默认的key_buffer_size也还好,但Innodb在大数据量时用默认值就感觉在爬了。 Innodb的缓冲池会缓存数据和索引,所以不需要给系统的缓存留空间,如果只用Innodb,可以把这个值设为内存的70%-80%。和 key_buffer相同,如果数据量比较小也不怎么增加,那么不要把这个值设太高也可以提高内存的使用率。

 

innodb_additional_pool_size
这个的效果不是很明显,至少是当操作系统能合理分配内存时。但你可能仍需要设成20M或更多一点以看Innodb会分配多少内存做其他用途。

 

innodb_log_file_size
对于写很多尤其是大数据量时非常重要。要注意,大的文件提供更高的性能,但数据库恢复时会用更多的时间。我一般用64M-512M,具体取决于服务器的空间。

 

innodb_log_buffer_size
默认值对于多数中等写操作和事务短的运用都是可以的。如果经常做更新或者使用了很多blob数据,应该增大这个值。但太大了也是浪费内存,因为1秒钟总会 flush(这个词的中文怎么说呢?)一次,所以不需要设到超过1秒的需求。8M-16M一般应该够了。小的运用可以设更小一点。

 

innodb_flush_log_at_trx_commit
抱怨Innodb比MyISAM慢100倍?那么你大概是忘了调整这个值。默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。

 

table_cache
打开表的操作代价很高。比如MyISAM表标记MYI头部来标记表在使用中。你不会希望频繁进行此操作,所以最好设置缓存使得能够保存大部分打开的表。它会用到一些系统资源和内存,但对于现在的硬件来说不是问题。对于200个表的运用1024比较好。如果你的连接数多,或者表多则再大一些。我见过超过100000的。

 

thread_cache
建立连接和断开时的线程的创建和死亡开销很大。我一般把它设为至少16。如果程序中有大量并发连接,而变量Threads_Created(status中可以看到)长得很快,那么会设大一些。主要是让正常操作中不要去创建线程。

 

query_cache
如果你的程序有大量的读操作而又没有程序级的缓存,那么把它设大一点应该有很大的帮助。但设得太大会减慢速度因为维护的开销很大。32M-512M就可以了。设过之后检查一下是否运行良好。For certain workloads cache hit ratio is lower than would justify having it enabled.(这句看不懂,我怀疑他写错了。一般来说,如果hit ratio比较低说明cache还不够大,可以适当的增加)

 

注意:这些都是一些全局变量。它们依赖于硬件和存储引擎,而session 的变量更偏重于负荷。如果你只做简单的查询,那么即使你有64G的内存可以浪费也没理由要增加sort_buffer_size。而且这样还可能会降低性能。我一般会把session变量的调整放到第二步,在弄清了负荷以后。

另外MySQL提供的my.cnf的样例不错,可以拿来改改了用。

### 配置和优化 MySQL 数据库系统参数 #### 查看当前配置与状态 为了了解现有的MySQL服务器配置,可以通过`SHOW VARIABLES`命令来获取所有全局变量的信息[^1]。这有助于识别哪些参数可能需要调整以提高性能。 ```sql SHOW GLOBAL VARIABLES; ``` 同样地,通过执行`SHOW STATUS`可以获得关于MySQL运行状况的数据,这对于评估系统的健康程度非常有用: ```sql SHOW GLOBAL STATUS; ``` #### 修改最大连接数 针对并发用户访问的需求,适当增加或减少`max_connections`是一个常见的做法。默认情况下,该值被设定为151,但这并不适用于所有的应用场景;因此应当依据具体的业务需求做出相应调整[^3]。可以在MySQL配置文件`my.cnf`中的`[mysqld]`部分添加如下行并保存更改后的文件,之后重启服务使新设置生效[^2]: ```ini [mysqld] max_connections=256 ``` #### 设置超时时间 为了避免长时间未响应的连接占用资源,合理配置连接超时时长至关重要。具体来说,有两个重要的参数——`connect_timeout` 和 `wait_timeout`。前者决定了尝试建立TCP/IP连接前允许的最大等待秒数,而后者则控制着非交互式会话在断开之前可以保持闲置的状态多长时间[^5]。下面是如何在`my.cnf`里定义这两个参数的例子: ```ini [mysqld] connect_timeout = 10 wait_timeout = 600 interactive_timeout = 600 ``` 请注意,除了上述提到的关键点外,还有许多其他因素也会影响MySQL的整体表现,比如查询缓存大小(`query_cache_size`)、InnoDB缓冲池尺寸(`innodb_buffer_pool_size`)等。这些都需要根据实际的工作负载特征仔细考量后再做决定[^4]。 #### 动态调整参数 某些参数支持动态更新而不必每次都重启整个数据库实例。例如要临时改变`max_connections`的数量直到下次启动为止,可直接使用SQL语句实现: ```sql SET GLOBAL max_connections = 300; ``` 但是需要注意的是并非所有选项都具备这样的灵活性,所以在实施任何变更之前最好先查阅官方文档确认其行为模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值