MySQL性能优化简介

MySQL在LAMP架构中是数据处理的重要组成部分。作为当前最受欢迎的开源数据库,网络上有众多优化教程可供参考。本文将重点探讨如何通过调整MySQL配置来提升其性能。请注意,数据库结构和SQL语句的优化不在本文讨论范围之内。
MySQL的性能优化可以分为三个方面:物理硬件优化、MySQL安装时的编译优化以及配置文件my.cnf的调整。
一、物理硬件优化
磁盘I/O是影响MySQL性能的主要因素之一。使用SSD服务器明显优于传统的HDD硬盘,而RAID10的性能也优于单盘配置。
物理硬件的优化本质上是对服务器(VPS)硬件的提升,包括更多的内存、更快的磁盘和更强的CPU,这无疑是实现最佳性能的关键。
二、MySQL安装时的编译优化
通常不推荐直接使用yum来安装MySQL,因为这会限制功能定制且版本较旧。因此,我更倾向于使用源代码进行编译安装。
编译安装所需的依赖包包括:
1、CMake。官方网站:http://www.cmake.org/
2、GCC,一个有效的ANSI C++编译器,建议使用GCC 4.2.1或更高版本。官方网站:http://www.gnu.org/software/gcc/
3、bison,版本2.1或更新。官方网站:http://www.gnu.org/software/bison/
4、m4。官方网站:http://www.gnu.org/software/m4/
5、tar。官方网站:http://www.gnu.org/software/tar/
编译参数如下:
MySQL 5.5.x
http://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html
MySQL 5.6.x
http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html
在LAMP一键安装脚本中,对MySQL编译的参数设置如下:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_EXTRA_CHARSETS=complex
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_READLINE=1
-DENABLED_LOCAL_INFILE=1
-DWITH_PARTITION_STORAGE_ENGINE=1
-DWITH_FEDERATED_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DWITH_MYISAM_STORAGE_ENGINE=1
-DWITH_EMBEDDED_SERVER=1
由于-DWITH_DEBUG的默认状态为OFF,因此无需特别指定此参数。
三、MySQL配置文件my.cnf的优化
配置文件:
MySQL 5.5.x
https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html
MySQL 5.6.x
https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html
结合LAMP一键安装脚本的my.cnf文件,我们主要关注[mysqld]段落,其它段落对MySQL性能影响较小,因此暂不讨论。
以下是一些优化参数的介绍:
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
# 避免MySQL的外部锁定,减少出错几率,提高稳定性。
key_buffer_size = 16M
# 指定用于索引的缓冲区大小,增大此值可提升索引处理性能。16M适用于512MB内存,4GB内存的服务器可设置为256M,依此类推。注意:设置过大可能导致整体效率降低!
max_allowed_packet = 1M
# 限制MySQL服务器接受的数据包大小。
table_open_cache = 64
# 指定表高速缓存的大小。在访问表时,如果缓冲区有空间,表将被打开并缓存,以便更快访问。注意,不应盲目增大此值,过高可能导致文件描述符不足,从而影响性能或连接失败。64适用于512MB内存,1GB内存可设置为128,依此类推。
sort_buffer_size = 512K
# 查询排序时可用的缓冲区大小。该值由每个连接独占,若有100个连接,则总共分配的排序缓冲区为100×512K=50MB。512K适用于512MB内存,1GB内存可设置为1M,依此类推。
net_buffer_length = 8K
# 初始化服务器接受的数据包大小,之后由max_allowed_packet控制增长范围。该值的范围为1-1024K。
read_buffer_size = 256K
# 读查询操作可用的缓冲区大小。每个连接独占,256K适用于512MB内存,1GB内存可设置为512K,依此类推。
read_rnd_buffer_size = 512K
# 多表查询操作可用的缓冲区大小,较大的值可有效提升ORDER BY的性能。每个连接独占,512K适用于512MB内存,1GB内存可设置为1M,依此类推。
myisam_sort_buffer_size = 8M
# MyISAM排序可用的缓冲区大小。8M适用于512MB内存,1GB内存可设置为16M,依此类推。
max_connections = 256
# 指定MySQL允许的最大连接数。如果频繁出现“Too Many Connections”错误提示,需增大此值。默认值为151,最大可设置为100000。建议设置为内存的一半,如512MB内存设置为256,依此类推。
[结语]
通过观察,我发现大多数MySQL优化建议来源于官方文档。国内的教程往往陈旧或大量转载,参考价值有限。
并不存在绝对的最佳配置,只有适合自己的配置。优化应结合实际情况,如内存大小和磁盘I/O状况进行调整。
LAMP一键脚本的默认配置(适用于512MB内存的VPS)未必适合你,更多参数请参阅官方网站。
