首页 > 代码库 > MySQL服务器性能优化

MySQL服务器性能优化

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

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

 

二:全局缓存

1.(key_buffer_size(默认值:384M)
2.innodb_buffer_pool_size
3.innodb_additional_mem_pool_size
4.innodb_log_buffer_size(默认值:8M)
5.query_cache_size(默认值:32M)

 

1.innodb_buffer_pool_size(默认值:128M)

1.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)

1.innodb_additional_mem_pool_size=16M

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

 

 

3.innodb_log_buffer_size(默认8M)

1.innodb_log_buffer_size=8M
2.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)

1.query_cache_size=256M
2.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.MyISAM存储引擎(key_buffer_size)

1.key_buffer_size=128M

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

缺点:mysql5.0上限4G

 

 

三:局部缓存

1.read_buffer_size
2.sort_buffer_size
3.read_rnd_buffer_size
4.tmp_table_size

 

 

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

1.read_buffer_size(默认值:2M)

1.read_buffer_size=4M

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

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

 

2.read_rnd_buffer_size(默认值:8M)

1.read_rnd_buffer_size=8M

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

 

3.sort_buffer_size(默认值: 2M)

1.sort_buffer_size=4M

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

 

4.tmp_table_size(默认值:16M)

1.tmp_table_size=16M

联合查询缓存大小

 

 

5.表缓存

table_open_cache

1.table_open_cache=4096

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

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

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

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

该值计算:max_connections*n

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

 

 

四:线程缓存(thread_cache_size)

1.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

 

 

五.InnoDB并发限制(innodb_thread_concurrency)

innodb_thread_concurrency=24

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

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

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

thread_concurrency=2*6*2=32

 

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

1.open_files_limit=65535

 

七.请求队列(back_log)

1.back_log=500

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

 

 

九:其他

 

1.参数如下

innodb_data_file_path = ibdata1:1G:autoextend 

innodb_log_file_size = 512M

 

 

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

1.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!
2.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!
3.2015-12-23 17:03:06 16182 [ERROR] Plugin ‘InnoDB‘ init function returned error.
4.2015-12-23 17:03:06 16182 [ERROR] Plugin ‘InnoDB‘ registration as a STORAGE ENGINE failed.
5.2015-12-23 17:03:06 16182 [ERROR] Unknown/unsupported storage engine: INNODB
6.2015-12-23 17:03:06 16182 [ERROR] Aborting

 

2.innodb_log_files_in_group = 2

 

MySQL服务器性能优化