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

MySQL性能优化

[复制链接]

979

主题

90

回帖

5万

积分

管理员

积分
53052
发表于 2022-7-4 16:57:12 | 显示全部楼层 |阅读模式

  {6 E5 c) x4 {+ [& o9 r" u% Y/ Q% Z9 G: l$ t
MySQL 作为 LAMP 组件中的重要一环,在网站架构中担当关于数据处理的重任。作为目前流行最为广泛的开源数据库,网络上已经有相当多的各种优化教程。本文将试着从改善 MySQL 配置入手,进一步提升 MySQL 的性能。: Q# H6 S6 h& ~; I
关于如何优化数据库结构及 SQL 语句不在本次讨论范围之内。3 f2 z$ }& f$ X' p; v3 K/ f5 Y
MySQL 性能优化我打算分为三个部分,一是物理硬件的优化,二是 MySQL 安装时的编译优化,三是 MySQL 的配置文件 my.cnf 的优化。
- p4 `5 A+ P8 C       
! B. z0 y) q5 N" g# ^4 ^5 g; M一、物理硬件的优化" r) B' v6 D6 d# W9 A9 \
磁盘 I/O 是制约 MySQL 性能的最大因素之一。$ m+ B- T8 W  T) q4 w8 s
采用 SSD 的服务器肯定会比普通 HDD 硬盘性能要好;采用 RAID10 的肯定要比单盘的性能要好。1 b! n5 Q( M  }- ~( r" p4 @8 m* A
所谓物理硬件的优化,其实也就是服务器(VPS)硬件的堆砌。更多的内存,更快的磁盘,更强的 CPU 无疑就是最佳的。
8 R1 F0 e. D( U0 ~, }8 Q$ P" R. V! ~二、MySQL 安装时的编译优化0 @* ~7 n8 K5 Q! H! h3 x
一般情况下不建议直接 yum 安装 MySQL ,一来不能定制功能,二来版本比较老。所以我一般会采取编译安装的方式。
. [9 `/ _/ y2 ?( c# I7 C7 H: ?源码编译安装的前提条件(依赖包):
/ v& o4 D6 C) |: e8 Y1、CMake。官网:http://www.cmake.org/ ' F6 I. y/ d( I% t
2、GCC,A working ANSI C++ compiler. GCC 4.2.1 or later。官网:http://www.gnu.org/software/gcc/
2 F7 `1 O) Q9 E& I8 ]3、bison,2.1 or newer。官网:http://www.gnu.org/software/bison/
: I8 q0 G% S. l1 _% {4、m4。官网:http://www.gnu.org/software/m4/
+ n( t* W% O* ?+ }: v1 W& Z5、tar。官网:http://www.gnu.org/software/tar/1 F% y. k& Q2 `
编译参数:
. Z8 u# @# t: @: J; V* yMySQL 5.5.x) M$ e- u! D8 f5 {$ }' K
http://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html
) b2 I* U5 ]. m) n* xMySQL 5.6.x  W; [: d' g( Z( b# G) X- B' w
http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html
& F+ x" C* |& X/ k( k6 PLAMP 一键安装脚本里对 MySQL 编译的参数如下:
+ J1 s& P& R2 n" [+ n. ~-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
+ ?8 V4 K# z, p  E4 J9 f/ p-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
! ?. |0 N3 o1 k* u6 n-DDEFAULT_CHARSET=utf8 $ h9 P, F# C& }8 I9 o2 `; M% P1 H
-DDEFAULT_COLLATION=utf8_general_ci
& K2 d  Q/ G! G* L4 v9 S. H! p-DWITH_EXTRA_CHARSETS=complex
: j7 A+ `: q% Y% _- ^( Z* s3 s-DWITH_INNOBASE_STORAGE_ENGINE=1 ( A3 j( A/ ?) ~: p3 r' @
-DWITH_READLINE=1
0 n# C, ]' i! c" A! A3 f-DENABLED_LOCAL_INFILE=1
: S0 E, G  @! v& U1 B# c0 f. F-DWITH_PARTITION_STORAGE_ENGINE=1 * W0 R! Y$ ~# F. N$ U% Y' J7 S
-DWITH_FEDERATED_STORAGE_ENGINE=1
; {- V. u* Y* Q/ S-DWITH_BLACKHOLE_STORAGE_ENGINE=1 " }5 i( }, h. Z6 |
-DWITH_MYISAM_STORAGE_ENGINE=1 ( Z' q' w$ L+ C
-DWITH_EMBEDDED_SERVER=1
4 n. _5 f. |4 ~3 Q$ r! [由于 -DWITH_DEBUG 默认就是 OFF 状态,所以也无需特别指定此参数。
! D( {7 n1 R$ P# [6 b三、MySQL 的配置文件 my.cnf 的优化
/ J4 D) K0 J& B+ P  i配置文件:
, a9 J0 Z0 V9 R# S# @MySQL 5.5.x
6 p" x% M- e0 s2 w# fhttps://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html! N8 p$ @- a) R9 E
MySQL 5.6.x0 @; s& g5 x- I; o, U3 h$ q' U
https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html
( o9 K: O3 _0 K8 L" I% A结合 LAMP 一键安装脚本的 my.cnf 文件,只列出其中 [mysqld] 段落中的内容,其他段落内容对 MySQL 运行性能影响甚微,因而姑且忽略。3 I7 u. ~5 C, L( R& r
介绍一些优化参数。0 V  V% Z. E. p9 X8 b( _
[mysqld]
. C9 n' {8 f8 I, A5 ~% C+ ^) Zport = 3306  B4 ~1 P! X6 n3 A! S
socket = /tmp/mysql.sock# E% W; ^0 }$ e$ p% `" o
skip-external-locking2 x( M7 D1 R; G6 b' q8 j
#避免 MySQL 的外部锁定,减少出错几率增强稳定性。& u3 X  R8 O! }( c# F
key_buffer_size = 16M- U4 R( ?, f6 n
#指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。16M适用于 512MB内存,对于内存在4GB左右的服务器该参数可设置为256M,依此类推即可。注意:该参数值设置的过大反而会是服务器整体效率降低!
( l  j+ U1 T' M4 `max_allowed_packet = 1M3 c2 E! V8 v5 h, R2 T' ^. w6 I2 E
#MySQL 根据此配置会限制 server 接受的数据包大小。& N" O. U. v$ a
table_open_cache = 64" M( l, M$ F4 T; y' _
#指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。注意,不能盲目地把table_open_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。
0 m& ]" A$ f# N& ^* x64 适用于 512MB 内存,1GB 内存则可以设置成 128,依此类推即可。
7 w% u8 y! {  j- M( z# f9 O  vsort_buffer_size = 512K
( T9 I1 r; F! [" F  W- p#查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 512K = 50MB。: L, Y/ J' `3 [" l
512K 适用于 512MB 内存,1GB 内存则可以设置成 1M,依此类推即可。% ]( U" ^3 [' z) {9 p
net_buffer_length = 8K7 V, B0 k, @% x$ t: k  b" C: b9 s
#初始化server 接受的数据包大小,当需要的时候再由 max_allowed_packet 控制增长的大小。注意:该参数值设置的范围只能为1 – 1024K。
- q3 n) w* T. \+ P! `5 h8 O' h& Lread_buffer_size = 256K' H( e- y" @! y# ^
#读查询操作所能使用的缓冲区大小。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享。
- z! {% U" M8 \# l) j- A2 ?# n! e6 @/ ^256K 适用于 512MB 内存,1GB 内存则可以设置成 512K,依此类推即可。$ X0 K% E% Q! x& M5 @% O- }
read_rnd_buffer_size = 512K
' e8 `* R) G! ^, v0 |6 W#查询操作多表所能使用的缓冲区大小。设置较大的值可以有效提升 ORDER BY 的性能。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享。
8 A5 `- B3 d: H( Y" y5 B512K适用于 512MB 内存,1GB 内存则可以设置成 1M,依此类推即可。7 P) i9 J# m8 p$ T
myisam_sort_buffer_size = 8M
5 _8 L* D6 j& `" z#MyISAM 排序所能使用的缓冲区大小。  k$ }6 x) ^9 \) n1 r; ^
8M 适用于 512MB 内存,1GB 内存则可以设置成 16M,依此类推即可。4 _) Y$ ]' _8 l* T& E* ^
max_connections = 256* `  F" V7 x4 \. ]' `5 G
#指定MySQL允许的最大连接进程数。如果在访问时经常出现 Too Many Connections 的错误提示,则需要增大该参数值。# s' M% V8 d9 k% {
注意:该参数默认值为 151,最大可以设置为 100000
8 V9 d# @1 q! V9 u3 |这里建议设置成内存的一半,比如 512MB 内存就设置成 256,依此类推。+ M/ q. ?. H) A3 {. f6 J7 g
[写在最后]6 S+ n$ ]9 S  K+ V5 }' Y4 P& b
我发现所谓的 MySQL 优化大部分都是来自于官方文档的说明。
! Q, l$ h2 {. z& i! u- D" o国内的教程要么是很老的,要么是随处转载的,几乎没有多大参考价值。
4 ^" ?9 y$ W) i  ~3 Q9 Z+ F没有最优的配置文件,只有适合自己的配置。所以需要结合实际情况,比如内存大小,磁盘 I/O 状况来调整。
/ p, v, W' F4 K3 J' j! x  xLAMP 一键脚本默认的配置(默认是用于 512MB 内存的 VPS),肯定不是适合你的(是适合我的)。
# N1 b1 R! k5 p7 ^5 m0 c而上面只是列举出几个比较重要的参数,更多的参数请参照官方网站。: ~5 S; _5 L* ^  M7 C  ?( L$ P

# x0 ]* o0 q( E  |6 y3 A% H
6 Z, L% U  g* a) G6 V% u, q+ g0 ^
7 W1 |5 i/ N3 d, l1 p1 I$ T
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2025-2-25 00:17 , Processed in 0.123740 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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