MySQL服务器性能优化

一:配置文件读取位置,不同系统my.cnf配置文件位置不同.

例如debian位置:/etc/mysql/my.cnf
找到mysqld二进制文件: find   /  -name  mysqld
/usr/bin/mysqld   --verbose  --help  | grep  -A 1  "Default options"

二:全局缓存

(key_buffer_size(默认值:384M)
innodb_buffer_pool_size
innodb_additional_mem_pool_size
innodb_log_buffer_size(默认值:8M)
query_cache_size(默认值:32M)

1.innodb_buffer_pool_size(默认值:128M)

innodb_buffer_pool_size=24G

优点:缓存索引,缓存行数据,自适应哈希索引,插入缓存,锁,内部数据结构

缺点:Innodb缓存过大,预热和关闭会花费大量时间.该时间由脏页数量决定的.因为在关闭之前会把脏页的写回数据文件.强制关闭后,恢复时间会很长.

解决缺点:  若要关闭mysql数据库,可以事先讲脏页的数量(innodb_max_dirty_pages_pct)调的小一点,值改小后,等待新的线程清理缓冲池,然后在脏页数量小得时候,再关闭数据库.

但是innodb_max_dirty_pages_pct越小,并不能保证脏页的数量会很小.

配置:内存的80%(前提是该服务器只跑了mysql一个消耗内存型,IO型的数据库)

监控:show  status   或者innotop工具

2.innodb_additional_mem_pool_size(默认值:8M)

innodb_additional_mem_pool_size=16M

存放数据字典信息以及一些内部数据结构的内存空间大小,当mysql实例数据库对象很多时,调大该值.判断是否足够,查看mysql的error日志中,看是否有warnning信息.

3.innodb_log_buffer_size(默认8M)

innodb_log_buffer_size=8M
innodb_flush_log_trx_commit=2

临时存放事务日志.InnoDB在写事务日志的时候,为了提高性能,先讲事务日志写到innodb_log_buffer中,当满足innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件 (或者同步到磁盘)中.

理想值为 1M 至 8M,一般不要超过32M.

注:innodb_flush_log_trx_commit参数对InnoDB Log的写入性能有非常关键的影响,默认值为1。该参数可以设置为0,1,2.

4.innodb_flush_log_trx_commit(默认值为1)

innodb_flush_log_trx_commit=2

该值对数据库的写入性能影响非常大.MySQL官方建议将插入操作合并成一个事务,这样可以大幅提高速度

实际测试发现,设置为2时插入10000条记录只需要2秒

设置为0时插入10000条记录只需要1秒,

设置为1时插入10000条记录需要229秒。在存在丢失最近部分事务的危险的前提下,可以把该值设为0。

事务刷新.可配置为0,1,2

0:表示log buffer中的数据会以每秒一次刷新的频率刷新到log file中.同时也会触发文件系统到磁盘的同步操作.

1:表示每次有新事务提交都会将log buffer中的数据刷新到log file中.同时也会触发文件系统到磁盘的同步操作.

2:表示每次有新事务提交都会将log buffer中的数据刷新到log file中,但是文件系统会以每秒一次的刷新频率到磁盘上.

5.query_cache_size(默认为32M)

query_cache_size=256M
query_cache_type=ON

缓存select语句的执行结果.单不是全部缓存,条件是查询到的结果集大小必须小于等于query_cache_size的大小.

注意:

该值得使用或者不用,取决于查询表中的数据是否经常变化,例如我公司的订单表.该表的数据时时刻刻都在变化,因此不能应用此选项.这是一个致命的配置.因为表中的数据一旦变化,那么存在查询缓存中的结果都会失效.

多个参数配合使用该选项.

query_cache_size  缓存结果集大小

query_cache_type ={0|1|2}

0:表示不用查询缓存

1:表示不使用缓存.1(ON)或者2(DEMOND),分别表示完全不使用query cache,除显式要求不使用query cache(使用sql_no_cache)之外的所有的select都使用query cache,

配置:256M足够

Query Cache的命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))来进行调整

6.key_buffer_size

key_buffer_size=128M

优点:缓存索引数据,并只缓存索引数据

缺点:mysql5.0上限4G

三:局部缓存(read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size )

这些局部内存在需要的时候才会分配,然后等操作完成之后就回立即释放占用的内存.

1.read_buffer_size(默认值:2M)

read_buffer_size=4M

顺序读缓存区,对表进行顺序扫描所分配的一块缓冲区.

如果程序定时去扫描数据表,应该增大该值来提高性能.

2.read_rnd_buffer_size(默认值:8M)

read_rnd_buffer_size=8M

随机读缓冲区,对表随机读取数据时分配的一块缓冲区.


3.sort_buffer_size(默认值: 2M)

sort_buffer_size=4M

用于oder by语句存放排序查询

4.tmp_table_size(默认值:16M)

tmp_table_size=16M

联合查询缓存大小

5.表缓存

table_open_cache

table_open_cache=4096

解释:存储对象是数据表.

监控:如果Opend_tables状态变量很大或者在增长,可能是表缓存不够大,应该增大.

缺点:当数据库中的表MyISAM表很多时,可能会导致关机时间很长.因为关机前索引块必须完成刷新.表都被标记为不再打开.

监控:如果发现open_tables等于table_open_cache,并且opened_tables在不断增长,那么你就需要增加table_open_cache的值了.

该值计算:max_connections*n

n表示查询语句中最大的表.

四:线程缓存(thread_cache_size)

thread_cache_size=64

解释:为新建mysql的连接而准备的线程.thread_cache_size保证缓存中的线程数.一般无需配置此值,除非数据库有大量的连接请求.当一个连接创建时,如果缓存中有线程存在,MYSQL从缓存

删除一个线程,并且把它分配给这个新的连接,当连接关闭时,若缓存中还有空间,MYSQL又会把这个连接放到缓存中.若没有空间,MYSQL会销毁这个线程.

监控:检查线程缓存是否够用,查看Threads_connectd状态变量.

例子:

Threads_connected在100-200之间,则thread_cache_size=20,足够.

Threads_connected在500-700之间,则thread_cache_size=200,足够.

通过连接线程池的命中率来判断设置值是否合适?命中率超过90%以上,设定合理。

(Connections -  Threads_created) / Connections * 100 %

thread_concurrency

解释:该值应该为CPU核数的2倍.

例子:2个物理cpu,每个CPU8核心,那么

thread_concurrency=2*8*2=32

5.InnoDB并发限制

innodb_thread_concurrency=24

解释:它会限制一次性可以有多少个线程进入内核.0表示不限制.在任何架构和业务压力下,设置好这个值很重要.

innodb_thread_concurrency=CPU数量*磁盘数量*2

例子:2个物理cpu,每个CPU8核心,那么

thread_concurrency=2*6*2=32

6.数据库文件描述符(open_files_limit)

open_files_limit=65535

7.请求队列(back_log)

back_log=500

mysql新建请求队列,只定max_connections达到最大时,还可以接受多少的请求,先放到队列中.每个

五:其他

1.

innodb_data_file_path = ibdata1:1G:autoextend

innodb_log_file_size = 512M

注意:以上参数在启动数据库前必须配置好,否则报错如下:

2015-12-23 17:03:06 16182 [ERROR] InnoDB: auto-extending data file ./ibdata1 is of a different size 768 pages (rounded down to MB) than specified in the .cnf file: initial 65536 pages, max 0 (relevant if non-zero) pages!
2015-12-23 17:03:06 16182 [ERROR] InnoDB: Could not open or create the system tablespace. If you tried to add new data files to the system tablespace, and it failed here, you should now edit innodb_data_file_path in my.cnf back to what it was, and remove the new ibdata files InnoDB created in this failed attempt. InnoDB only wrote those files full of zeros, but did not yet use them in any way. But be careful: do not remove old data files which contain your precious data!
2015-12-23 17:03:06 16182 [ERROR] Plugin ‘InnoDB‘ init function returned error.
2015-12-23 17:03:06 16182 [ERROR] Plugin ‘InnoDB‘ registration as a STORAGE ENGINE failed.
2015-12-23 17:03:06 16182 [ERROR] Unknown/unsupported storage engine: INNODB
2015-12-23 17:03:06 16182 [ERROR] Aborting

2.innodb_log_files_in_group = 2

时间: 2024-10-05 21:44:39

MySQL服务器性能优化的相关文章

从数据库、代码和服务器对PHP网站Mysql做性能优化

数据库优化是PHP面试几乎都会被问到的事情,也是我们工作中应该注意的事情,当然,如果是小网站无所谓优化不优化,网站访问量大了自然会暴漏数据库的瓶颈,这个瓶颈是各方面问题综合导致的,下面我们来做下数据库优化的总结. 一:对数据库优化 1.创建索引 对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致.如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少

Mysql数据库性能优化(一)

参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库. mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面

《高性能MySQL》第三章MySQL服务器性能剖析学习笔记

MySQL性能优化介绍 什么是性能优化呢?其实我们往往从广义的定义是觉得一个MySQL系统的非功能性的优化都会看作是性能优化,比如我们会将数据库服务器的稳定性.每秒执行的SQL查询数目.系统的可扩展性.cpu利用率等等特性的优化都会看成是MySQL的性能优化. 我个人比较赞同本书的观点是MySQL性能优化应该就是指MySQL的查询响应时间的优化,MySQL性能优化就是将查询响应时间优化到一个客户或者用户体验能够接受的一个程度.

架构设计:系统存储(9)——MySQL数据库性能优化(5)

=================================== (接上文<架构设计:系统存储(9)--MySQL数据库性能优化(5)>) 4-3-3-3.避免死锁的建议 上一篇文章我们主要介绍了MySQL数据库中锁的基本原理.工作过程和产生死锁的原因.通过上一篇文章的介绍,可以确定我们需要业务系统中尽可能避免死锁的出现.这里为各位读者介绍一些在InnoDB引擎使用过程中减少死锁的建议. 正确使用读操作语句 经过之前文章介绍,我们知道一般的快照读是不会给数据表任何锁的.那么这些快照读操作

mysql innodb 性能优化

默认情况下,innodb的参数设置的非常小,在生产环境中远远不够用比如最重要的两个参数innodb_buffer_pool_size 默认是8Minnodb_flush_logs_at_trx_commit 默认设置的是1 也就是同步刷新log(可以这么理解) innodb_buffer_pool_size: 这是InnoDB最重要的设置,对InnoDB性能有决定性的影响.默认的设置只有8M,所以默认的数据库设置下面InnoDB性能很差.在只有 InnoDB存储引擎的数据库服务器上面,可以设置6

Web服务器性能优化

Web 服务器性能与站点访问性能优化思路 要优化 Web 服务器的性能,我们先来看看 Web 服务器在 web 页面处理上的步骤:1.Web 浏览器向一个特定的服务器发出 Web 页面请求;2.Web 服务器接收到 web 页面请求后,寻找所请求的 web 页面,并将所请求的 Web 页面传送给 Web 浏览器;3.Web 浏览器接收到所请求的 web 页面内容,并将它显示出来. 上面三个步骤都关系 Web 服务器,但实际 Web 服务器性能相关最大的是在第 2 步,这里 Web 服务器需要寻找

【MySql】性能优化之分析命令

[MySql]性能优化之分析命令     一 当发现程序运行比较慢的时候,首先排除物力资源问题之后,就将注意力转向mysq数据库: 1.首先确定运行慢的sql语句: mysql> show full processlist; 2.确认低效的查询: 多次执行第一步发现time耗费大的sql语句.查看耗费的时间. 3.为sql生成一个执行计划query Execution plan(QEP) mysql> explain select * from tbal_name where ...; 4.查

170727、MySQL查询性能优化

MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下我们从数据库的索引和查询语句的设计两个角度介绍如何提高MySQL查询性能. 数据库索引 索引是存储引擎中用于快速找到记录的一种数据结构.索引有多种分类方式,按照存储方式可以分为:聚簇索引和非聚簇索引:按照数据的唯一性可以分为:唯一索引和非唯一索引:按照列个数可以分为:单列索引和多列索引等.索引也有多

MySQL数据库性能优化的关键参数(转)

我们在进行数据库管理和开发中经常会遇到性能问题,这就涉及到MySQL的性能优化.通过在网络上查找资料和笔者自己的尝试,我认为以下系统参数是比较关键的: 关键参数一:back_log 要求 MySQL 能有的连接数量.当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程. back_log 值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中.只有如果期望在一个短时间内有很多连接,你需要增加它,换句话