找回密码
 立即注册
搜索
查看: 232|回复: 0

MySQL性能优化

[复制链接]

991

主题

92

回帖

5万

积分

管理员

积分
55422
发表于 2022-7-4 16:57:12 | 显示全部楼层 |阅读模式
  C' b4 Z- }! f
! L: Q9 |3 C* J3 P
MySQL 作为 LAMP 组件中的重要一环,在网站架构中担当关于数据处理的重任。作为目前流行最为广泛的开源数据库,网络上已经有相当多的各种优化教程。本文将试着从改善 MySQL 配置入手,进一步提升 MySQL 的性能。
; J2 e, o! W  x8 U6 C关于如何优化数据库结构及 SQL 语句不在本次讨论范围之内。
' c1 I) X; V! }: l! c4 j( u% ZMySQL 性能优化我打算分为三个部分,一是物理硬件的优化,二是 MySQL 安装时的编译优化,三是 MySQL 的配置文件 my.cnf 的优化。3 w" A' [  e4 u& \
        1 A, ^8 W/ k7 }0 l$ b
一、物理硬件的优化/ }7 S" N0 j/ C
磁盘 I/O 是制约 MySQL 性能的最大因素之一。
  o( Y. [6 ]" u  W& p$ v, F) g采用 SSD 的服务器肯定会比普通 HDD 硬盘性能要好;采用 RAID10 的肯定要比单盘的性能要好。
1 d# \9 g( b# n所谓物理硬件的优化,其实也就是服务器(VPS)硬件的堆砌。更多的内存,更快的磁盘,更强的 CPU 无疑就是最佳的。
: @5 l( I5 I: [( Q6 x二、MySQL 安装时的编译优化
. W( Y. M! T7 B$ }# Y& T一般情况下不建议直接 yum 安装 MySQL ,一来不能定制功能,二来版本比较老。所以我一般会采取编译安装的方式。; I, @# D) n0 P3 ~) i, r
源码编译安装的前提条件(依赖包):7 R5 g! ]! v) L$ N
1、CMake。官网:http://www.cmake.org/
$ N: \1 p- D2 B7 J# C2、GCC,A working ANSI C++ compiler. GCC 4.2.1 or later。官网:http://www.gnu.org/software/gcc/
0 |* x1 s. r7 F9 c; e3 b3、bison,2.1 or newer。官网:http://www.gnu.org/software/bison/
- t7 a: K6 h  ]7 W. x- k4 r# Z4、m4。官网:http://www.gnu.org/software/m4/' Y/ e* f( q' |# ?$ `) h4 l
5、tar。官网:http://www.gnu.org/software/tar/
; q9 m; g6 Y3 r编译参数:: V. [; Z0 M, W; S0 u
MySQL 5.5.x
9 M& }3 r7 Y& L: [2 p; {: khttp://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html
. D$ C$ A6 o% E) uMySQL 5.6.x
% F+ X6 N$ Q4 u& y& Bhttp://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html
( m7 J( F( m( F  G5 ELAMP 一键安装脚本里对 MySQL 编译的参数如下:: v9 E4 z( J0 j. d( y
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql 6 Y8 }$ q' d- i. S# ]
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock * A3 ]6 ?+ ^0 m& k
-DDEFAULT_CHARSET=utf8 2 n! V: F& I  e7 t9 ?+ M
-DDEFAULT_COLLATION=utf8_general_ci
2 {5 e* Y! o# m6 a-DWITH_EXTRA_CHARSETS=complex ' L% V9 |+ T9 P8 Z7 p& I5 c4 L
-DWITH_INNOBASE_STORAGE_ENGINE=1
, B  a# e" e8 b. _" A7 u-DWITH_READLINE=1 5 `9 G' N' M$ o7 U
-DENABLED_LOCAL_INFILE=1
( t4 A+ [  D7 S6 }2 @8 d" G-DWITH_PARTITION_STORAGE_ENGINE=1 , R) U/ a$ f/ C6 T& p
-DWITH_FEDERATED_STORAGE_ENGINE=1
; M+ F2 B: D  r& Z3 Z-DWITH_BLACKHOLE_STORAGE_ENGINE=1
, V" h, R6 X) i+ g9 `-DWITH_MYISAM_STORAGE_ENGINE=1 " C/ O% \" {1 @$ [0 U
-DWITH_EMBEDDED_SERVER=1$ k3 v" ?% Q0 L, l0 T% w
由于 -DWITH_DEBUG 默认就是 OFF 状态,所以也无需特别指定此参数。
. ]7 [" o% k4 v* x三、MySQL 的配置文件 my.cnf 的优化
6 X0 g/ E9 W7 o( {2 e% {$ S0 M+ L配置文件:  N1 j- L, P/ K$ f  [6 K! n$ r7 c
MySQL 5.5.x
" M8 ~9 F! \  Whttps://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html
  y7 `6 E# H/ D8 L; P  IMySQL 5.6.x
5 `( `! y- J3 m8 l* y2 R' Y& Bhttps://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html
, [0 m7 o7 i# \结合 LAMP 一键安装脚本的 my.cnf 文件,只列出其中 [mysqld] 段落中的内容,其他段落内容对 MySQL 运行性能影响甚微,因而姑且忽略。: O' s" D, i5 T. v& s* ~; k& d( E
介绍一些优化参数。
4 u6 q- e# b+ p) Y' Z+ r$ {[mysqld]
/ m5 M* a* M) qport = 3306' k7 m6 [; A2 t8 g& {
socket = /tmp/mysql.sock
9 r" T8 k# w: w2 p% eskip-external-locking
) m% I" c" F  l- P2 C#避免 MySQL 的外部锁定,减少出错几率增强稳定性。( I$ x9 N( s/ P; K
key_buffer_size = 16M
( A" J# C; `: F: F( }#指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。16M适用于 512MB内存,对于内存在4GB左右的服务器该参数可设置为256M,依此类推即可。注意:该参数值设置的过大反而会是服务器整体效率降低!' }8 L' N. y! j" A  {
max_allowed_packet = 1M- d& a$ c7 ~/ s: x* M/ f
#MySQL 根据此配置会限制 server 接受的数据包大小。% L3 y- D* l. G7 c3 ^8 S9 J+ }
table_open_cache = 64# |8 K5 s9 Z3 W2 x
#指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。注意,不能盲目地把table_open_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。
$ @$ I) b% P3 ~8 o64 适用于 512MB 内存,1GB 内存则可以设置成 128,依此类推即可。* A" W1 R! y) b5 ^. {
sort_buffer_size = 512K8 O: O' p- g& {$ s- F: T. r
#查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 512K = 50MB。. _7 d; x* h- |4 v9 [* w* n
512K 适用于 512MB 内存,1GB 内存则可以设置成 1M,依此类推即可。0 H: X% |: z" [* E# I& |5 g  k/ D
net_buffer_length = 8K8 y: o. D3 S' F! M8 u/ |5 K1 O
#初始化server 接受的数据包大小,当需要的时候再由 max_allowed_packet 控制增长的大小。注意:该参数值设置的范围只能为1 – 1024K。
: Q/ ?5 }$ d4 `read_buffer_size = 256K  T1 X  i  Y# {, j
#读查询操作所能使用的缓冲区大小。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享。0 i. M% A  a8 `
256K 适用于 512MB 内存,1GB 内存则可以设置成 512K,依此类推即可。! @( l7 o6 V2 ?. h% J/ s7 \9 w
read_rnd_buffer_size = 512K% a/ x8 }6 W( i+ G# f0 P
#查询操作多表所能使用的缓冲区大小。设置较大的值可以有效提升 ORDER BY 的性能。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享。
' i, _' D) k' ]0 P# D0 a512K适用于 512MB 内存,1GB 内存则可以设置成 1M,依此类推即可。# C( g3 L8 e- p+ ]  j2 d
myisam_sort_buffer_size = 8M" X; Z) @0 V' N! N
#MyISAM 排序所能使用的缓冲区大小。
$ z1 t, p+ r* f/ a# l. M8M 适用于 512MB 内存,1GB 内存则可以设置成 16M,依此类推即可。3 K1 |  v/ L# A
max_connections = 2569 T% P  Y2 V/ b1 B
#指定MySQL允许的最大连接进程数。如果在访问时经常出现 Too Many Connections 的错误提示,则需要增大该参数值。, Q# _7 v  c( W7 e# }1 T4 d
注意:该参数默认值为 151,最大可以设置为 100000
* t* L4 Q9 X, [9 {这里建议设置成内存的一半,比如 512MB 内存就设置成 256,依此类推。& J* W  f. Q: m+ a% `
[写在最后]
: F6 y$ _( E8 K我发现所谓的 MySQL 优化大部分都是来自于官方文档的说明。/ D' w) n/ p7 M7 M/ N* ?
国内的教程要么是很老的,要么是随处转载的,几乎没有多大参考价值。+ v" `* F9 u7 n$ `: b6 L3 \  j# Z: n
没有最优的配置文件,只有适合自己的配置。所以需要结合实际情况,比如内存大小,磁盘 I/O 状况来调整。
  \$ @% A2 U7 Y$ H6 m: DLAMP 一键脚本默认的配置(默认是用于 512MB 内存的 VPS),肯定不是适合你的(是适合我的)。( s; Z- t* E% K% g2 m* m7 V4 a
而上面只是列举出几个比较重要的参数,更多的参数请参照官方网站。
% q, \; o% x6 I0 [, H* a
! E2 J. @8 k4 I4 \& X* i5 F  R0 W& B* L# ]) [8 m2 M: q7 J4 @* F
3 P: b, U# Q2 h5 ]" _6 _8 \
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-6-20 01:05 PM , Processed in 0.099547 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表