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

MySQL性能优化

[复制链接]

986

主题

92

回帖

5万

积分

管理员

积分
55255
发表于 2022-7-4 16:57:12 | 显示全部楼层 |阅读模式
7 z0 L) v% V+ t9 G: \; y6 z
0 V  S# G+ s( u
MySQL 作为 LAMP 组件中的重要一环,在网站架构中担当关于数据处理的重任。作为目前流行最为广泛的开源数据库,网络上已经有相当多的各种优化教程。本文将试着从改善 MySQL 配置入手,进一步提升 MySQL 的性能。7 d; F9 c, A3 h& X
关于如何优化数据库结构及 SQL 语句不在本次讨论范围之内。
' K! ^, x! ~+ Z( oMySQL 性能优化我打算分为三个部分,一是物理硬件的优化,二是 MySQL 安装时的编译优化,三是 MySQL 的配置文件 my.cnf 的优化。2 N5 y9 p; K7 f
       
; X* W* X6 e( {4 N1 C% R) m7 W一、物理硬件的优化
* d, ]' }8 E% F; [6 R. _磁盘 I/O 是制约 MySQL 性能的最大因素之一。$ W9 u, [. `8 Q3 k! y
采用 SSD 的服务器肯定会比普通 HDD 硬盘性能要好;采用 RAID10 的肯定要比单盘的性能要好。
. X, {8 A. n9 @) Y所谓物理硬件的优化,其实也就是服务器(VPS)硬件的堆砌。更多的内存,更快的磁盘,更强的 CPU 无疑就是最佳的。1 V/ C, h1 N: K( b- V
二、MySQL 安装时的编译优化/ w1 ?% R7 [6 v- r2 B% m1 p& j
一般情况下不建议直接 yum 安装 MySQL ,一来不能定制功能,二来版本比较老。所以我一般会采取编译安装的方式。
) \/ g" e( O: e% N: d- M( r6 K源码编译安装的前提条件(依赖包):
& o6 `2 F8 V' h5 a" a  n- j# }: e- ?1、CMake。官网:http://www.cmake.org/
0 B, c' Q: c7 l2 S, _# o2、GCC,A working ANSI C++ compiler. GCC 4.2.1 or later。官网:http://www.gnu.org/software/gcc/: H9 w* ?1 u& J& ?6 U5 r
3、bison,2.1 or newer。官网:http://www.gnu.org/software/bison/
$ d  I! f( r. K4、m4。官网:http://www.gnu.org/software/m4/
. X& g' _# q' K; G/ o$ K& V5、tar。官网:http://www.gnu.org/software/tar/* \! g% B8 s9 L" H3 p
编译参数:* \4 B5 N# n4 G6 C! p% b8 U' I1 H
MySQL 5.5.x
+ o8 g% B6 W6 a3 f# a  Uhttp://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html. L  S# q4 V( p- o9 l
MySQL 5.6.x
+ B* H; Y. ]% `8 Mhttp://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html
! U! z3 F: `4 R8 I( yLAMP 一键安装脚本里对 MySQL 编译的参数如下:: ~8 L% I) P: }% G# d/ u- ~( S
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql " }1 Z, V8 P* G" N3 _
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
+ H, |, n. x( b! K. L5 o) o" u-DDEFAULT_CHARSET=utf8
3 ^( W* ]* @; D$ |$ g! s-DDEFAULT_COLLATION=utf8_general_ci ) S; O1 p: A! v
-DWITH_EXTRA_CHARSETS=complex 5 i* t; j  u1 L
-DWITH_INNOBASE_STORAGE_ENGINE=1 + r3 ^6 |3 x2 |& t! J
-DWITH_READLINE=1 7 L6 D4 X4 F( V; X7 P/ l! c6 X8 i% U
-DENABLED_LOCAL_INFILE=1
' Q8 d( l; ]) _" `3 `! ]* d+ S9 _" ?+ ?-DWITH_PARTITION_STORAGE_ENGINE=1 9 j8 o" o$ E" [7 H+ d4 K4 p& f
-DWITH_FEDERATED_STORAGE_ENGINE=1 0 N, v. i4 u3 h2 ~
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
. T1 Q/ Q* j2 h* Q-DWITH_MYISAM_STORAGE_ENGINE=1
1 O) }6 v+ R$ U# v; K-DWITH_EMBEDDED_SERVER=1% O$ p# S! C; W' O9 O  O- T6 B9 ~
由于 -DWITH_DEBUG 默认就是 OFF 状态,所以也无需特别指定此参数。5 \% \9 N' J  j% S
三、MySQL 的配置文件 my.cnf 的优化
* L/ N3 a* f, [配置文件:! U; `% q" w1 o% @- c
MySQL 5.5.x$ l8 q& W0 k# K, [5 k
https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html4 o0 ]+ J7 @+ k4 C0 R
MySQL 5.6.x
0 H" a" [' M: Q7 z- Z( G6 z; xhttps://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html2 X; S* R/ `/ X/ ]
结合 LAMP 一键安装脚本的 my.cnf 文件,只列出其中 [mysqld] 段落中的内容,其他段落内容对 MySQL 运行性能影响甚微,因而姑且忽略。4 j' _2 s* S! J) O9 l; r& e2 ]+ n3 t5 V
介绍一些优化参数。/ q- n2 v* k0 `+ L
[mysqld]1 V  {* l" {, U  e$ C3 w
port = 3306" w3 g6 @  d1 f# f" c+ y% P0 E
socket = /tmp/mysql.sock& D; j) v/ j3 Z/ T9 m$ d. [4 P
skip-external-locking
/ L* E: p9 `6 F- E#避免 MySQL 的外部锁定,减少出错几率增强稳定性。
1 m* R* T2 |$ U0 G% {key_buffer_size = 16M
6 e0 Y, B1 a9 l* A#指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。16M适用于 512MB内存,对于内存在4GB左右的服务器该参数可设置为256M,依此类推即可。注意:该参数值设置的过大反而会是服务器整体效率降低!
! Z2 }* p4 o6 z8 s2 @& J  o6 tmax_allowed_packet = 1M8 d0 b, Z  O- S4 C; N' f
#MySQL 根据此配置会限制 server 接受的数据包大小。
/ b; q* w+ r, j0 }  c4 R( \table_open_cache = 64) [0 ~9 j$ q- W( L
#指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。注意,不能盲目地把table_open_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。% M5 K% n  k9 d, |
64 适用于 512MB 内存,1GB 内存则可以设置成 128,依此类推即可。7 ]* ?, N* C# U. N7 l
sort_buffer_size = 512K
. `* j2 K$ I& t8 f; h9 H#查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 512K = 50MB。* {1 X4 n3 n; t9 M; S1 G3 L
512K 适用于 512MB 内存,1GB 内存则可以设置成 1M,依此类推即可。
, u' Y, l2 r* Z& E( k5 g: [0 Enet_buffer_length = 8K, Y: [$ ^4 v3 f* z- z5 {% i4 `7 m
#初始化server 接受的数据包大小,当需要的时候再由 max_allowed_packet 控制增长的大小。注意:该参数值设置的范围只能为1 – 1024K。
( ~) S0 M8 i( Y3 Pread_buffer_size = 256K# k( B9 S& N, ]  f- f, _3 `0 a6 R
#读查询操作所能使用的缓冲区大小。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享。
" @% d$ K3 @! x& d) W0 I+ T1 t256K 适用于 512MB 内存,1GB 内存则可以设置成 512K,依此类推即可。
: [# U# ^, ~! V2 d5 n6 m2 {read_rnd_buffer_size = 512K
& x+ Y2 ?, f% r8 Q& M# E# ?. Z#查询操作多表所能使用的缓冲区大小。设置较大的值可以有效提升 ORDER BY 的性能。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享。( M4 x" x: S) e/ i$ c) f& `, `
512K适用于 512MB 内存,1GB 内存则可以设置成 1M,依此类推即可。# I" V) a3 d) [  y$ k# w
myisam_sort_buffer_size = 8M+ V* a! ]1 w! B. R+ I( g( z
#MyISAM 排序所能使用的缓冲区大小。1 C4 {: z! n; C( U4 Q  U- T' }$ B7 h
8M 适用于 512MB 内存,1GB 内存则可以设置成 16M,依此类推即可。1 z  o  q6 {( ?0 a2 U9 X
max_connections = 256
4 a1 d9 v1 r, A' f0 X#指定MySQL允许的最大连接进程数。如果在访问时经常出现 Too Many Connections 的错误提示,则需要增大该参数值。
$ |# z- T2 v1 [注意:该参数默认值为 151,最大可以设置为 100000. z9 K. `, n3 I" p# {
这里建议设置成内存的一半,比如 512MB 内存就设置成 256,依此类推。
; L6 f; t! r4 B% v+ Z* x3 h' T7 F) h, L[写在最后]; a5 y2 O& q7 o3 E* C3 o
我发现所谓的 MySQL 优化大部分都是来自于官方文档的说明。* {2 A4 p/ h5 ~5 K
国内的教程要么是很老的,要么是随处转载的,几乎没有多大参考价值。
0 g3 Q- l0 L: f( V- v没有最优的配置文件,只有适合自己的配置。所以需要结合实际情况,比如内存大小,磁盘 I/O 状况来调整。; a% P/ n' h8 |% U
LAMP 一键脚本默认的配置(默认是用于 512MB 内存的 VPS),肯定不是适合你的(是适合我的)。
) {! r% H1 X6 D- p而上面只是列举出几个比较重要的参数,更多的参数请参照官方网站。
" e. c4 J0 O' P! X+ C9 Y8 X  B3 q, e& F* \2 g
5 _# g% b, \( r) K% ]  d2 G5 t! C  ^

- q" a! A& B$ X! F* r& K
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-3-22 02:37 AM , Processed in 0.069783 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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