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

MySQL性能优化

[复制链接]
发表于 2022-7-4 16:57:12 | 显示全部楼层 |阅读模式

) n' D) H9 j7 W+ R: Q2 d6 N" J) u* x5 ~' f3 }( z
MySQL 作为 LAMP 组件中的重要一环,在网站架构中担当关于数据处理的重任。作为目前流行最为广泛的开源数据库,网络上已经有相当多的各种优化教程。本文将试着从改善 MySQL 配置入手,进一步提升 MySQL 的性能。
$ b# a- ^7 W' K0 u关于如何优化数据库结构及 SQL 语句不在本次讨论范围之内。+ @" r/ L, u1 W9 r: i2 Y* j1 T+ F& m
MySQL 性能优化我打算分为三个部分,一是物理硬件的优化,二是 MySQL 安装时的编译优化,三是 MySQL 的配置文件 my.cnf 的优化。# D( d9 ]" h! _( d; j/ [  A
       
  t" W5 n0 m. _, L. R一、物理硬件的优化3 _2 ^+ D0 ?) J. P
磁盘 I/O 是制约 MySQL 性能的最大因素之一。; ]/ ^5 i# f& j& z# @- H4 P+ E
采用 SSD 的服务器肯定会比普通 HDD 硬盘性能要好;采用 RAID10 的肯定要比单盘的性能要好。  G$ e5 u6 q1 p& n* F% C0 m3 A2 l: z
所谓物理硬件的优化,其实也就是服务器(VPS)硬件的堆砌。更多的内存,更快的磁盘,更强的 CPU 无疑就是最佳的。
  |4 d& [9 N- t, R二、MySQL 安装时的编译优化
/ t  n& {" r$ U# r; n7 k一般情况下不建议直接 yum 安装 MySQL ,一来不能定制功能,二来版本比较老。所以我一般会采取编译安装的方式。
2 o( |" n$ _) x# D( s. E源码编译安装的前提条件(依赖包):- }5 w1 h3 P8 r: G$ K
1、CMake。官网:http://www.cmake.org/ ! N/ C5 F, ~; w5 p! O$ ^
2、GCC,A working ANSI C++ compiler. GCC 4.2.1 or later。官网:http://www.gnu.org/software/gcc/
! \' M( `) f% d( l/ l3、bison,2.1 or newer。官网:http://www.gnu.org/software/bison/( d3 ?: e, M, H& V  F; P0 y
4、m4。官网:http://www.gnu.org/software/m4/- J/ }4 [3 u, t9 I7 k4 c+ }
5、tar。官网:http://www.gnu.org/software/tar/
$ ^! I' l& v8 k编译参数:
1 h* w7 ?6 H% e1 l3 T  zMySQL 5.5.x
$ e( g/ @; A+ S" ^/ \5 L4 ~. phttp://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html
! y1 S% p* o3 ?" Q" L: R0 N- AMySQL 5.6.x
  C8 ?6 K0 |& ]5 G- h# g% [8 K7 `http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html
* s$ B" q  ]$ E5 qLAMP 一键安装脚本里对 MySQL 编译的参数如下:
+ ~7 q9 |1 Z% p! h-DCMAKE_INSTALL_PREFIX=/usr/local/mysql / S& T% E/ E/ T" |/ B7 I
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock # x; \% Z2 e/ p% b3 ?
-DDEFAULT_CHARSET=utf8 7 z5 P2 w! P. j' C/ c
-DDEFAULT_COLLATION=utf8_general_ci ' f0 `! f) P1 n: l
-DWITH_EXTRA_CHARSETS=complex , v4 }9 Q  a* ?$ M. j$ Y! p# x
-DWITH_INNOBASE_STORAGE_ENGINE=1 . N: O* N) W5 O2 D; h3 R0 [
-DWITH_READLINE=1
8 m$ ]) u4 y7 {; q6 k& S: e4 C-DENABLED_LOCAL_INFILE=1 2 B8 m4 R" y* r; _
-DWITH_PARTITION_STORAGE_ENGINE=1
2 w2 `0 n1 ?# c( p-DWITH_FEDERATED_STORAGE_ENGINE=1 1 `' |. k( r) V& v3 \7 S
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
" n2 s# q* E& {* b1 p-DWITH_MYISAM_STORAGE_ENGINE=1
1 T) t" |, N; P-DWITH_EMBEDDED_SERVER=1# r) P/ l6 n5 v* n6 C, ]
由于 -DWITH_DEBUG 默认就是 OFF 状态,所以也无需特别指定此参数。
8 |8 w% _4 i5 t; F6 u: d三、MySQL 的配置文件 my.cnf 的优化
+ w0 \+ G; o' [: O2 k  x配置文件:5 |+ v" {" A" Z5 @' l& C4 T. y
MySQL 5.5.x
+ F% {& g& g2 ?; X# t) ^. hhttps://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html( s9 z- o& W2 y5 A) \
MySQL 5.6.x* I1 a) _# o: U6 I
https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html
$ L4 {  g, x- p' J) Z3 g结合 LAMP 一键安装脚本的 my.cnf 文件,只列出其中 [mysqld] 段落中的内容,其他段落内容对 MySQL 运行性能影响甚微,因而姑且忽略。8 W% ~( a3 `7 g  Y
介绍一些优化参数。0 T8 Q2 o4 r0 r5 j3 w: m1 i
[mysqld]/ \+ z+ |/ \( q- G& Q4 W4 a! J( P
port = 33065 T, E! M2 u/ u+ M2 ]! w- d
socket = /tmp/mysql.sock
- E: l: O9 X, B0 xskip-external-locking
' y% [2 f3 q3 `9 y. @2 Y; T9 F#避免 MySQL 的外部锁定,减少出错几率增强稳定性。: f5 J  H2 _; |% c0 _0 _+ q7 X% m. {3 ]
key_buffer_size = 16M
! x% L4 w2 @- k' E4 V#指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。16M适用于 512MB内存,对于内存在4GB左右的服务器该参数可设置为256M,依此类推即可。注意:该参数值设置的过大反而会是服务器整体效率降低!. N$ g4 h& |, G& J7 z+ S
max_allowed_packet = 1M
8 K  }* R0 y6 u/ x5 J8 i#MySQL 根据此配置会限制 server 接受的数据包大小。
- _2 W9 u" G! |9 W2 C6 J. u0 l5 utable_open_cache = 64
0 {2 X+ r, K( N9 I( A" Y1 x#指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。注意,不能盲目地把table_open_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。
) R4 R, Z7 `$ G8 R. d0 T64 适用于 512MB 内存,1GB 内存则可以设置成 128,依此类推即可。# ~* y, }$ L1 k( J2 [0 _) h$ C
sort_buffer_size = 512K
' e) N5 e* H6 C6 @& O: s#查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 512K = 50MB。
' A. ~  L* v2 s8 ]5 z0 _. k% t512K 适用于 512MB 内存,1GB 内存则可以设置成 1M,依此类推即可。
5 }9 }8 l4 H( I, L/ Vnet_buffer_length = 8K4 t+ p* i& j  o" c: |7 |/ q
#初始化server 接受的数据包大小,当需要的时候再由 max_allowed_packet 控制增长的大小。注意:该参数值设置的范围只能为1 – 1024K。' ~; T5 Y5 w9 F1 B
read_buffer_size = 256K. K  ?# g% Q0 B
#读查询操作所能使用的缓冲区大小。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享。9 S: n" S% D5 @" j
256K 适用于 512MB 内存,1GB 内存则可以设置成 512K,依此类推即可。$ c, O3 J2 y# S% n
read_rnd_buffer_size = 512K9 t0 O/ i+ i. w4 [5 i! x# l) x
#查询操作多表所能使用的缓冲区大小。设置较大的值可以有效提升 ORDER BY 的性能。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享。
6 \: B7 x* c6 \512K适用于 512MB 内存,1GB 内存则可以设置成 1M,依此类推即可。9 }7 N% V# a+ l
myisam_sort_buffer_size = 8M
$ k) R2 b& [: G, r. v$ s  T' q- q* X#MyISAM 排序所能使用的缓冲区大小。: O  Y% H* Z* [& ~& j0 ~& U! W
8M 适用于 512MB 内存,1GB 内存则可以设置成 16M,依此类推即可。
* h  c  @+ v  Q3 J7 {. Z1 Emax_connections = 256
8 G; y; S' q2 y/ N; ]) z#指定MySQL允许的最大连接进程数。如果在访问时经常出现 Too Many Connections 的错误提示,则需要增大该参数值。& |) Q% Y: z; m. B9 ?/ A+ y0 q
注意:该参数默认值为 151,最大可以设置为 100000
/ k0 m8 U: u9 m+ M9 Y  h6 M: [0 b这里建议设置成内存的一半,比如 512MB 内存就设置成 256,依此类推。" h, E( s% e! |4 Q1 D
[写在最后]/ ?! p8 `/ F8 t  X+ Q
我发现所谓的 MySQL 优化大部分都是来自于官方文档的说明。
5 h. R/ j6 g! D! m% H  W5 |国内的教程要么是很老的,要么是随处转载的,几乎没有多大参考价值。) m! l7 u# i& J* k* U# \/ a$ f
没有最优的配置文件,只有适合自己的配置。所以需要结合实际情况,比如内存大小,磁盘 I/O 状况来调整。" x! k( f9 ~$ m& ]8 W
LAMP 一键脚本默认的配置(默认是用于 512MB 内存的 VPS),肯定不是适合你的(是适合我的)。
2 N6 @+ B7 U8 y而上面只是列举出几个比较重要的参数,更多的参数请参照官方网站。) h: Q" k$ Q+ w* M
2 w$ x9 c' _- p5 l8 q
8 [1 x7 T/ z5 Q; ~  m! e( K

/ V9 [( a4 `( J3 c7 h: o
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-11-3 04:45 AM , Processed in 0.100917 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2026 Discuz! Team.

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