针对Mysql数据库服务器的优化

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

Mysql 数据库的优化

  最近一直在搞Mysql数据库的配置和优化,下面记录一下这些天研究的结果,以方便以后查看。
 
一、服务器的硬件的优化
 
对mysql服务器来说主要从以下几个方面来考虑:
1、磁盘寻道能力(磁盘I/O)
  因为Mysql每一秒都在进行着大量的、复杂的查询操作,对磁盘的读写可想而知,所以通常认为磁盘的I/O是制约Mysql性能的最大因素之一。如果磁盘的I/O性能不好,造成的直接后果就是MySqL的性能非常低下,对于这种情况可以考虑使用RAID1+0。对于硬盘来说最好选那种转速比较快的,这样数据的操作的效率也会有大的提高。
2、cpu对于Mysqlr 影响也是不容忽视的,要选择运算能力强悍的cpu.
3、内存不要小于2GB,最好使用4GB以上的物理内存。
4、服务器选择上可以dell的R710 2颗cpu(双四核) 16G内存(这个可以扩展的)硬盘有两种选择:一个是300G、15000r的,一种是500G的7200r的 可以根据自己的需要来选择。也可选HP的DL580G5。我在工作中使用的dell的R710。
 
二、MySqL配置文件的优化
 
  MySqL在服务器上安装最好是选择源码编译安装。对于MySqL的优化主要是在/etc/my.cnf这个文件中来修改一些参数。
  在这个文件中主要的参数是在[mysqld]这部分中,这部分中主要包括了mysqld服务启动参数,它涉及的方面很多,其中有MysqL的目录文件和文件、通信、网络、信息安全、内存管理、优化、查询缓存区,还有MySql的日志设置等。下面就来看一下这个有文件中的参数:
 
port = 3306   
// mysql服务的运行时的端口
socket = /tmp/mysql.sock  
//socket文件是在Linux/Unix环境下特有的,用户在Linux/Unix环境下客户端连接可以不通过TCP/IP网络而直接使用unix socket连接MySqL。
skip-locking  
//避免MySqL的外部锁定,减少出错率,增强稳定性。
skip-name-resolve  
//禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意的是,如果开启该选项,财所有远程主机连接授权都要使用IP地址的方式了,否则MySQL将无法正常处理连接请求!
back_log = 256 
//back_log参数的值指出在MySqL暂时停止响应新请求之前,短时间内多少个请求可以被存在堆栈中。如果系统在短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的监听队列的大小。不同操作系统在这个队列的大小上有自己的限制。如果试图将back_log设定得高于操作系统的限制将是无效的。其默认值为50。对于Linux系统而言,推荐设置为小于512的整数。
key_buffer_size = 256 
//指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。对于内存4GB左右的服务器来说,该参数可设置为256MB或者384MB。
max_allowed_packet = 1M
//设定在网络传输中一次消息量的最大值。系统默认为1MB,最大值1GB,必须设定为1024的倍数,单位为字节。
thread_stack = 192K 
//设置MySQL每个线程的堆栈大小,默认值足够大,可满足普通操作。可设置范围为128KB至4GB。默认为192KB。
table_cache = 614K  (mysql 5.1.3之后这个设置就变为了table_open_cache)
//指示表高速缓冲区的大小。当MySqL访问一个表时,如果在MySQL表缓冲区中还有空间,那么这个表就被打开并放入表缓冲区,这样做的好处是可以更快速地访问表中的内容。一般来说,可以查看数据库运行峰值时间的状态值Open_tables和Opened_tables,用以判断是否需要增加table_cache的值,即如果Open_cache的接近table_cache的时候,并且Opened_tables这个值在逐渐增加,那就要考虑增加这个值的大小了。
sort_buffer_size = 6M  
//设定查询排序时使用的缓冲区大小,系统默认大小为2MB。注意::这个参数对应的分配内存是每个连接独占的,如果有100个连接,那么实际分配的总排序缓冲区大小为100x6=600MB。所以,对于内存在4GB左右的服务器来说,推荐将其设置为6MB到8MB
read_buffer_size = 2M
//读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享。
join_buffer_size = 4M  
//联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享。
myisam_sort_buffer_size = 8M  
//设置在REPAIR TABLE或用CAREATE INDEX创建索引或ALTER TABLE 的过程中排序索引所分配的缓冲区大小,可设置范围4Bytes到4GB,默认为8MB。
thread_cache_size = 64  
//设置Thread Cache池中可以缓存的连接线程的最大数量,可以设置为0~16384,默认为0。这个值表示可以重新利用保存在缓存中线程的数量。当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中;如果线程重新被请求,那么请求将从缓存中读取;如果缓存中是空的或者是新的请求,那么这个线程将被重新创建;如果有很多新的线程,增加这个值可以改善系统性能。通过比较Connections和Threads_created状态的变量,可以看到这个变量的作用。我们可以根据物理内存设置规则如下:1GB内存我们配置为8,2GB内存我们配置为16,3GB我们配置为32,4GB或更大的我们给此值为64或更大的数值。
query_cache_size=256M
//指定MySQL查询缓冲的大小。可以通过在MySQL控制台观察,如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况;如果Qcache_hits的值非常大,则表明查询缓冲使用得非常频繁。另外,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲。对于Qcache_free_block,如果该值非常大,则表明缓冲区中碎片很多。
tmp_table_size = 256M
//设置内存临时表最大值。如果超过该值,则将会把临时表写入磁盘,其范围为1KB到4GB。
max_connections = 5000  
//指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提示,则需要增大该参数值。
max_connect_errors = 6000
//设置每个主机的连接请求异常中断的最大次数,当超过该次数,MySQL服务器将禁止host的连接请求,直到MySQL服务器重新启动或通过flush hosts 命令清空此host的相关信息。
wait_timeout = 120
//指定一个请求的最大连接时间,对于4GB左右内存的服务器来说,可以将其设置为5~10.
thread_concurrency = 8  
//该参数取值为服务器逻辑CPU数量X2,在本例中,服务器有两个物理CPU,而每个物理CPU又支持H.T超线程,所以实际取值为4X2=8。这也是目前双四核主流服务器的配置。
skip-networking  
//开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果Web服务器是以远程连接的方式访问MySQL数据库服务器的,则不要开启该选项,否则将无法正常连接!
table_cache = 614 (这个在5.1.3后就变成了table_open_cache)
//给经常访问的表分配的内存,物理内存越大,设置就越大。调大这个值,一般情况下可以降低磁盘IO,但是相应的会占用更多的物理内存,这这里设置为614
innodb_addition_mem_pool_size = 1M  
//默认为1MB
innodb_flush_log_at_trx_commit = 1  
//设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1,也是最安全的设置。
innodb_log_buffer_size = 2M  
//默认为1MB,通常设置为8~16MB就足够了。
innodb_thread_concurrency = 8  
//你的服务器有几个CPU就设置为几,建议用默认设置,一般为8.
read_rnd_buffer_size = 16M  
//设置进行随机读的时候所使用的缓冲区。此参数和read_buffer_size所设置的Buffer相反,一个是顺序读的时候使用,一个是随机读的时候使用。但是两者都是针对线程的设置,每个线程都可以产生两种Buffer中的任何一个。read_rnd_buffer_size的默认值256KB,最大值4GB。
 
  以上只一些理论参考值,很多时候需要具体情况具体分析,其他参数的变更我们可以等MySQL上线稳定一段时间后再根据status值进行调整。
  
  
 
本文转自 ZhouLS 51CTO博客,原文链接:http://blog.51cto.com/zhou123/1152994

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
JavaScript 关系型数据库 MySQL
❤Nodejs 第六章(操作本地数据库前置知识优化)
【4月更文挑战第6天】本文介绍了Node.js操作本地数据库的前置配置和优化,包括处理接口跨域的CORS中间件,以及解析请求数据的body-parser、cookie-parser和multer。还讲解了与MySQL数据库交互的两种方式:`createPool`(适用于高并发,通过连接池管理连接)和`createConnection`(适用于低负载)。
18 0
|
16天前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
12 0
|
22天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
16天前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
82 1
|
18天前
|
关系型数据库 MySQL 数据库
卸载云服务器上的 MySQL 数据库
卸载云服务器上的 MySQL 数据库
33 0
|
1天前
|
存储 缓存 关系型数据库
掌握MySQL数据库这些优化技巧,事半功倍!
掌握MySQL数据库这些优化技巧,事半功倍!
|
1天前
|
缓存 关系型数据库 MySQL
MySQL数据库优化技巧:提升性能的关键策略
索引是提高查询效率的关键。根据查询频率和条件,创建合适的索引能够加快查询速度。但要注意,过多的索引可能会增加写操作的开销,因此需要权衡。
|
2天前
|
SQL Oracle 关系型数据库
下次老板问你MySQL如何优化时,你可以这样说,老板默默给你加工资
现在进入国企或者事业单位做技术的网友越来越多了,随着去O的力度越来越大,很多国企单位都开始从Oracle向MySQL转移,相对于Oracle而言,MySQL最大的问题就是性能,所以,这个时候,在公司如果能够处理好MySQL的性能瓶颈,那么你也就很容易从人群中脱颖而出,受到老板的青睐。
20 1
|
9天前
|
SQL 缓存 Java
Java数据库连接池:优化数据库访问性能
【4月更文挑战第16天】本文探讨了Java数据库连接池的重要性和优势,它能减少延迟、提高效率并增强系统的可伸缩性和稳定性。通过选择如Apache DBCP、C3P0或HikariCP等连接池技术,并进行正确配置和集成,开发者可以优化数据库访问性能。此外,批处理、缓存、索引优化和SQL调整也是提升性能的有效手段。掌握数据库连接池的使用是优化Java企业级应用的关键。
|
10天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
37 3